gjoi 11.15

news/2024/11/18 7:47:25/文章来源:https://www.cnblogs.com/chelsyqwq/p/18551537

t1 对数

有的人可以推出动态规划的柿子(鸡),有的人可以直接看出找规律的柿子(鱼),而卑劣阴暗的老鼠只能想着动态规划推半天推出了比正常东西难调一点的别人直接找规律能看出来的东西。

首先考虑什么时候 \(x\oplus y=x|y\),显然是不能存在一位 \(x/y\) 二进制都为 \(1\),看到数据范围不妨考虑数位 dp。那么应该先考虑 \(0\leq x,y\leq 2^{len}-1\) 的情况,对于一个 \(x\) 来说,其为 \(1\) 的位上 \(y\) 一定是 \(0\),否则随意,总方案数应该是枚举有多少个 \(0\) 然后加起来 \(\sum_{i=0}^{len}\binom{n}{i}\times 2^{len}=3^{len}\)

现在考虑钦定一个前缀带来的贡献,首先应该特殊处理 \(x=y=0\) 之后给前缀应该加上一个匹配更小的数的约束来防止 \(y\) 超过 \(R\),最后倍增答案即可。分情况讨论,如果钦定前缀的开头是 \(1\),那么为 \(1\) 的位必须对应 \(0\) 别的随意就是更小的,乘上后缀 \(3\) 的幂就是方案数,如果钦定前缀开头是 \(0\),这种只有没有前缀相等一种,后面可以随便选贡献是一个不用乘 \(2\)\(3^{n-1}\)

#include<bits/stdc++.h>
#define int long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)using namespace std;const int N=1000005, P=998244353;int n, pw2[N], pw3[N], Ans, cnt;
char str[N];signed main() {freopen("pair.in","r",stdin);freopen("pair.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cin >> (str+1), n=strlen(str+1), pw2[0]=pw3[0]=1;up(i,1,n) pw2[i]=2*pw2[i-1]%P, pw3[i]=3*pw3[i-1]%P;up(i,2,n) {if(str[i]=='0') ++cnt;if(str[i]=='1') (Ans+=pw3[n-i]*pw2[cnt+1]%P)%=P;}(Ans+=pw2[cnt])%=P;cout << (2*Ans%P+pw3[n-1])%P << '\n';return 0;
}

T2 联通图

眼睛题,有人看错题+不知道数据范围浪费了一两个小时我不说是谁,看对了马上就会坐了,然后其实在看对题目的情况下这个题目瞎子可能会不好做。

这个题目感觉比较需要手玩来熟悉题目流程性质,手玩之后可以变成下述便于观察的形式。用一种好看的画图方式,称原点为白点,新加入的点为黑点,将黑点画在白点旁边保持树的形状,一个时刻的连边的规则如下:

  • 白点与白点连边
  • 黑点邻居连边,如果有黑点连向黑点否则连向白点

因为连边只向邻域,有一个比较显然的观察,一条树边两边两部分在这个图上关联性容易剥离,意思是不会有跨过去的环的贡献。进一步的,点与点之间的两条边最多能合并住 \(3\) 个连通块,那么树形 dp 子树里面最多有两个连通块,设计一个 dp 一个 \(f_{i,1/2}\) 表示子树 \(i\) 里面有 \(1/2\) 个连通块就非常的对了,转移还是很简单的分讨,就是 lgjoj 好像卡 vector 存前后缀积的常。

#include<bits/stdc++.h>
#define int long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)
#define pb push_backusing namespace std;const int N=5005, P=998244353;int n, col[N], f[N][3], L[N], R[N];
vector<int> to[N]; inline void mul(int &a,int b) { a=a*b%P; }
inline void add(int &a,int b) { a=(a+b)%P; }void dp(int x,int fad) {if(col[x]==0) f[x][1]=1, f[x][2]=0; if(col[x]==1) f[x][1]=0, f[x][2]=1;if(fad&&to[x].size()==1) return;for(int y:to[x]) if(y!=fad) {dp(y,x);if(col[x]==0) {if(col[y]==0) mul(f[x][1],f[y][1]);if(col[y]==1) mul(f[x][1],(2*f[y][1]%P+f[y][2])%P);}if(col[x]==1) {if(col[y]==0) mul(f[x][2],2*f[y][1]%P);if(col[y]==1) mul(f[x][2],(2*f[y][1]%P+f[y][2])%P);}}if(col[x]==1) {int cnt=0, ran=0;for(int y:to[x]) if(y!=fad) {++cnt;if(col[y]==0) L[cnt]=R[cnt]=2*f[y][1]%P;if(col[y]==1) L[cnt]=R[cnt]=(2*f[y][1]%P+f[y][2])%P;}L[0]=R[cnt+1]=1;up(i,1,cnt) L[i]=L[i-1]*L[i]%P;dn(i,cnt,1) R[i]=R[i+1]*R[i]%P;for(int y:to[x]) if(y!=fad) {++ran;add(f[x][1],L[ran-1]*R[ran+1]%P*f[y][1]%P);}}
}signed main() {freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cin >> n;up(i,2,n) {int u, v;cin >> u >> v;to[u].pb(v);to[v].pb(u);}up(i,2,n) {int x;cin >> x;col[x]=1;dp(1,0);cout << f[1][1] << '\n'; }return 0;
}

T3 函数

看着肯定是要先找结论弄点充要条件了,我不相信自己的智力水平能稳定快速做出来这类东西,可以打个表辅助一下观察,先根据部分分的提示考虑 \(a_i=i\) 的情况。

首先有一些很显然的分析,先上一个有脑去重以防万一,模数 \(x_1>x_2>\dots>x_m\),然后 \(a’_i<x_m\)\(i\in[1,x_m),a'_i=i\) 以及 \(a_{x_m}=0\)

#include<bits/stdc++.h>
#define int long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)using namespace std;const int N=5005;int n, a[N];signed main() {
//	freopen("chk.out","w",stdout);mt19937_64 rd(chrono::steady_clock::now().time_since_epoch().count());chrono::steady_clock::now().time_since_epoch().count();
//	ios::sync_with_stdio(0);
//	cin.tie(0);n=20;up(i,1,n) a[i]=i;int x=n;for(int x:{3,5,7}) {cout << "mod " << x << '\n';up(i,1,n) a[i]%=x;cout << "A "; up(i,1,n) printf("%d ",a[i]); cout << '\n';} cout << "zero "; dn(i,n,1) if(a[i]==0) cout << i << ','; cout << '\n';return 0;
}

很难不发现答案形式为 \(a_i=a_{i-1}\) 或者 \(a_i=0\),很难不猜到对于一个 \(a'\),只要把 zero 那一串放进循环的 vector 里面就可以构造出来相同的 \(a'\)发现这个合法解怎么构造跟判定没有任何关系哈哈哈

然后发现 \(a’_i<x_m / i\in[1,x_m) / a'_i=i / a_i=a_{i-1} 或者 a_i=0\) 凑在一起就是充要的了,构造方式如上,证明也比较简单,因为不超过 \(x_m\) 个就会有一个 \(0\),所以每一次只会掉其本身没有可以影响到的倍数,别的都很自然。

现在问题是怎么去重力,首先枚举 \(x(x_m)\),考虑 \(f_{i,j}\) 表示考虑了 \(a'_1,\dots,a'_i\)\(a'_i=j\) 时的方案数,为了去重应该钦定有 \(a'_i\) 碰到过 \(x-1\),转移非常简单但是题解真的还挺误导人的不嘻嘻,具体而言要写个分讨,\(0/1\) 的部分我不赘述了:

  • \(a_i-j<=a_{i-1}\),此时若 \(a'_i=j\) 则有 \(a'_{i-1}=j+a_{i-1}-a_i\),转移 \(f_{i-1,j+a_{i-1}-a_i}\to f_{i,j}\)
  • \(a_i-j>a_{i-1}\),此时 \(a'_{i-1}\) 选什么都行,则有 \(o\in[0,x),f_{i-1},o\to f_{i,j}\)

初始化的时候去掉 \(\leq x\) 的部分然后钦定初始前继为 \(x\),答案是 \(\sum_{x}\sum_{i=0}^{x-1}fx_{n,i}\)

#include<bits/stdc++.h>
#define int long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)
#define pb push_backusing namespace std;const int N=505, P=998244353;int n, a[N], f[N][N][2], Ans;inline void add(int &a,int b) { a=(a+b)%P; }signed main() {freopen("mod.in","r",stdin);freopen("mod.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cin >> n;up(i,1,n) cin >> a[i];sort(a+1,a+1+n), n=unique(a+1,a+1+n)-a-1;up(x,1,501) { int pos=1, flag=0, w0=0, w1=0, tmp;up(i,1,n) if(a[i]==x-1) flag=1;while(pos<=n&&a[pos]<=x) ++pos; memset(f,0,sizeof(f));tmp=a[pos-1], a[pos-1]=x;f[pos-1][0][flag]=1;if(flag) w1=1; else w0=1;up(i,pos,n) {up(j,0,x-1) {if(a[i]-j<=a[i-1]) {if(j==x-1) {add(f[i][j][1],f[i-1][j+a[i-1]-a[i]][0]);add(f[i][j][1],f[i-1][j+a[i-1]-a[i]][1]);}else {add(f[i][j][0],f[i-1][j+a[i-1]-a[i]][0]);add(f[i][j][1],f[i-1][j+a[i-1]-a[i]][1]);}}else {if(j==x-1) add(f[i][j][1],w0), add(f[i][j][1],w1);else	   add(f[i][j][0],w0), add(f[i][j][1],w1);}}w0=w1=0;up(j,0,x-1) add(w0,f[i][j][0]), add(w1,f[i][j][1]);}add(Ans,w1), a[pos-1]=tmp;}cout << (Ans%P+P)%P;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835974.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读数据质量管理:数据可靠性与数据质量问题解决之道07异常检测

异常检测1. 监控和异常检测 1.1. 在数据方面,所有明面上的测试和数据质量检查都不能完全保护你免受数据宕机的影响1.1.1. 宕机可能由于各种原因而出现在管道内部和外部的各个阶段1.1.2. 这些原因通常与数据本身无关1.2. 要了解数据何时中断,最好的做法是依靠数据监控,特别是…

2024.11.18 鲜花

浅谈多线程浅谈多线程打上花火 あの日(ひ)见渡(みわた)した渚(なぎさ)を 那天所眺望的海岸 a no hi mi wa ta shi ta na gi sa wo 今(いま)も思(おも)い出(だ)すんだ 直至今日仍能想起 i ma mo o mo i da su n da 砂(すな)の上(うえ)に刻(きざ)んだ言叶(ことば) 在沙滩上刻下的…

Rocky9.3安装snipe-it

全新安装最小化rocky 使用root用户登入系统,避免之后麻烦 安装几个工具yum -y install net-tools wget vim gcc按照官方文档要求安装必须的软件我们首先安装一下php,因为现在仓库中的php版本不满足8.1以上的要求,所以我们到php官网下载8.3.13使用wget下载到根目录下的tmp好了…

【圆圆的日语教室】日语入门第2课-平假名的书写+了解日本

第二课 相似的假名平假名的书写あ (a) 的书写第二笔不要太直,它是从草书演变过来的,特点是圆润有弧度 第三笔要交叉 长得像“安”い (i) 的书写第一笔要勾上去う (u) 的书写第一笔:点第二笔:起笔不要太平,先往上走再往下拐。联想记忆:u住耳朵え (e) 的书写联想:e,见到一…

Scrum 冲刺博客-day3

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 Scrum 冲刺博客-day3团队成员 梁志聪 李永杰 曾繁曦一、会议照片二、工作情况成员 昨天已完成工作 今日计划工作梁志聪 编写主菜单,人物移动相关代码 设计障碍物,实现人物碰撞李永杰 构思大…

基于RDK X5的智慧交通监控系统

本Blogs同步发表至CSDN:https://blog.csdn.net/xiongqi123123/article/details/143840675?sharetype=blogdetail&sharerId=143840675&sharerefer=PC&sharesource=xiongqi123123&spm=1011.2480.3001.8118 一、项目背景在当前高等教育普及化、大学持续扩招的宏…

【ai+模型】五大主流开源大模型RAG评估框架详解

RAG 评估的挑战 增强检索生成技术(Retrieval Augmented Generation,简称 RAG)目前正成为增强大语言模型(LLM)性能的核心手段。该技术通过将外部知识库融入LLM,大幅提升了大模型的精确度和对上下文的感知力。然而,对 RAG 系统性能的评测颇具挑战,这促使了一系列开源 RAG…

【待发】CyberEdge:简洁而强大的互联网资产测绘工具

免责声明 利⽤本文所提供的信息而造成的任何直接或者间接的后果及损失,均由使⽤者本⼈负责,创作者及作者不为此承担任何责任,一旦造成后果请自行承担责任!简介: CyberEdge是一款精心设计的互联网资产测绘工具,为网络安全专业人士提供精准、高效的扫描体验。 核心特性: 全…

Spring Security 认证授权(黑马讲义)

1.基本概念 1.1.什么是认证 用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。 1.2.什么是授…

SkyWalking 安装部署操作指引

环境 CentOS-7-x86_64-DVD-2009.iso https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso apache-skywalking-apm-10.0.1.tar.gz https://dlcdn.apache.org/skywalking/10.0.1/apache-skywalking-apm-10.0.1.tar.gz jdk-11.0.23_linux-x64_bin.tar.…

Win11 24H2 使用Rclone将SMB协议链接转为本地磁盘驱动器

9月份升级了ITX主机,多了好几块机械硬盘, 后来又买了Nas, 先装了飞牛Nas系统, 结果要格盘,考虑到Refs, Zfs, exFAT 在坏盘情况对数据恢复不友好, 决定改用Win11作为Nas 系统 .Windows 做Nas 系统不要太好, 免去各类docker 的缓慢和配置,可以正常使用迅雷等各类软件,并且很多Nas…

在Keil中使用ST-LINK烧录STM32程序指南

前言 之前玩STM32都是用J-LINK烧录程序,不仅便捷,而且烧录的速度比用串口快好多。 最近我接了几个32单片机的毕设单子,便买了几块C8T6的最小系统板用来开发。最初我还是用J-LINK烧录C8T6的,只要从J-LINK中找出对应的引脚用杜邦线连上就可以烧录,但是每晚要去学校的实验室,…