集省轮一东山6202
我感觉我写的题解大部分都不是给人看的,不过一般比较不是给人看的都不太长,几分钟还不会的话就别看我写的了(
Day1
A 挑战不可计算之钟型图灵机
图灵机
补不了一点(
B 树邻域修改查询
神秘数据结构 等价类分治
虽然我可能真不太会这个题,但是让我们写一下等价类分治
考虑现在你要对 \(n\) 个东西做 \(m\) 次操作,考虑对这 \(m\) 次操作分治,初始有 \(n\) 个等价类,每次下降一个节点,如果在这个节点中,两个等价类总是一起被操作,那么就合并这两个等价类。在每一层执行这个操作,当遍历到叶子结点就打 tag,然后回溯的时候拆等价类,将打在合并之后的tag下传到拆出来的等价类里。
这个题就是 \(x\) 个操作最多划分出 \(x^2\) 个等价类,然后分成 \(\sqrt n\) 个段,每个段内做等价类分治,然后发现总复杂度 \(n\sqrt n\)
C 第一百九十九
支配对,但是KDT
支配对感觉挺有用的,抽空整理一下。
Day2
菜完了啊。。。
A 门锁
神秘东西维护期望根号的东西
B 矩乘游戏
给定一个 \(n \times n\) 的非负整数矩阵 \(A\),其第 \(i\) 行第 \(j\) 列(\(1 \le i, j \le n\))的值记作 \(A_{i,j}\)。
给定非负整数 \(L, R\),对每个 \(1 \le x \le n\) 的整数 \(x\),求出:
的值。
\(1 \le T \le 3,1 \le n \le 100, 0 \le L \le R \le 10^{15},0 \le A_{i,j} \le 100\)
给图,转环求循环节
好像嗯跑循环节可以获得70分,100分我不会啊。。。
C 密码
给定 \(n, m\) 和一个长度为 \(n-1\) 的序列 \(w_1, w_2, \dots, w_{n-1}\)。对一个长度为 \(n\)、元素在 \([1, m]\) 内的整数序列 \(a\),小 M 用如下方式定义它的价值 \(f(a)\):
- 初始系数 \(X\) 为 \(1\)。
- 有 \(n-1\) 个机器人,编号分别为 \(1\) 至 \(n-1\),每个机器人分别做恰好一次检查。
- 其中第 \(i\) 个机器人将会检查 \(\forall 1 \le j \le i\),是否满足 \(a_j = a_{n-i+j}\)。如果全部满足,则将 \(X\) 改为 \(X \cdot w_i\) 的值,否则 \(X\) 不变。
- 最后记序列的价值 \(f(a) = X\)。
小 M 想知道,在序列 \(a\) 每个位置 \(a_i\) 都均匀独立随机生成的情况下,\(f(a)\) 的期望值是多少?你只需要求出其对 \(998244353\) 取模意义下的结果即可。
\(n \le 800, 1 \le m \le 10^5,0 \le w_i < 998244353\)
部分分
| 得分 | $n \le $ |
|---|---|
| 12 | 10 |
| 20 | 20 |
| 44 | 220 |
| 72 | 500 |
| 100 | 800 |
仔细观察一下,一个串的贡献即为 \(\prod_{有长度为i的border}w_i\)
12分可以直接摁搜是不是新建一种颜色
20分考虑是不是加入一个长度为x的border,但是可能会有一些位置已经钦定了不相等了,没有方法算。
考虑容斥,本来分为两种情况,是border和不是border,符合条件贡献w_i,不符合条件贡献1。容斥一下,考虑一个串被钦定和不被钦定,被钦定贡献 \(w_i-1\),不被钦定 \(1\)。一个串的贡献可以看成 \(\prod_i((w_i-1)[钦定有长度为i的border]+1)\)。
从长度短的开始考虑,每次考虑更长的钦定加入的border,如果一个串已
经可以由之前的钦定确认加入,那就直接按照 \(w_i\) 计算贡献,否则分别考虑钦定并贡献 \(w_i-1\) 和不钦定的情况。
void dfs(int u,ll res) {//读入的时候 w[i] 已经变为 w[i]-1
if(u==n) {
for(int i=1;i<=n;i++) if(find(i)==i)
res=res*m%MOD;
(ans+=res)%=MOD;
return ;
}
if(bk[u]) {
dfs(u+1,res*(w[u]+1)%MOD);
return ;
}
dfs(u+1,res);
int sav[n+1];
for(int i=1;i<=n;i++) sav[i]=fat[i];
for(int i=1;i<=u;i++) U(i,n-u+i);
vector<int>nw;
for(int i=u+1;i<=n;i++) if(!bk[i]) {
bool flag=true;
for(int j=1;j<=i;j++) if(find(j)!=find(n-i+j))
flag=false;
if(flag) {
nw.push_back(i);
bk[i]=true;
}
}
dfs(u+1,res*w[u]%MOD);
for(int x:nw) bk[x]=false;
for(int i=1;i<=n;i++) fat[i]=sav[i];
return ;
}
40分考虑剪枝,如果当前最长和次长的两个border长度分别为 \(a,b\)
如果 \(2\times b \le a\) 那么中间 \(a-2 \times b\) 的位置可以不受限制地随便填
如果 \(2\times b > a\) 那么中间会有长度为 \(2\times b-a\) 的重叠部分,我们可以发现,只需要保证 \(b\) 和 \(2 \times b - a\) 是border,即可保证 \(a\) 和 \(b\) 是 border,然后拿bitset和unordered_map记搜一下即可。
ll dfs(int u) { //这个的 w_i 也提前 -1 了
if(u==1) return m;
if(mp.count(bit)) return mp[bit];
ll res=0; bit[u]=0;
for(int i=u-1;i>=1;i--) {
int rec=bit[i];
bit[i]=1;
if(i*2<=u) (res+=dfs(i)%MOD*(w[i]+rec)%MOD*pw[u-2*i])%=MOD;
else {
bool flag=false;
if(!bit[2*i-u]) {
bit[2*i-u]=1;
flag=true;
}
(res+=dfs(i)%MOD*(w[i]+rec)%MOD)%=MOD;
if(flag) bit[2*i-u]=0;
}
bit[i]=rec;
if(bit[i]) {
bit[u]=1;
return mp[bit]=res;
}
}
(res+=pw[u])%=MOD;
bit[u]=1;
return mp[bit]=res;
}
72分考虑根据周期引理,若 \(a,b\) 是周期且 \(a+b-\gcd(a,b) \le n\),则 \(\gcd(a,b)\) 是周期。那相邻长度的三个 border 可以尝试合并成两个,从大往小考虑。
100好像是把hash改成trie树。
三个序列归并求第k小,如果还想不起来就直接看原题面吧
na,nb,nc<=1e5,查询次数<=100
发现如果 \(p_a+p_b+p_c<=k\),那么三个位置的min那个序列,可以把下界设成当前取到的位置。k也会缩小相应大小。 \(3\log(k=3n)\)
其实可以更小,因为 \(p_a+p_b+p_c>=k\) ,那么三个位置的max那个序列,可以把上界设成当成当前取到的问题,每次一个序列折半, \(9\log_2(n)\)
巨困难的题,我还不会,希望我退役之前能会一下。
我应该也掉线了,但是可能比前一个题简单点???
P15942 JOI Final 2026 赌场 / Casino
你说的对,这个题应该写也应该整理。
我怎么对这个题一点印象都没有。
我怎么对这个题一点印象都没有。
我猜我睡觉了。
Day3
A 巴巴博弈
线性代数题,场切了
B 数论题
?
C 矩阵
01矩阵 横排字典序不降,竖排字典序不降
我靠我真牛啊,知道大概思路,自己胡代码胡出来了。
不过要说这个做法,好像也没啥。记录开始哪些列之间有限制,结束后哪些列之间有限制。为了处理行的限制,我们每次钦定最开头的那一列前多少个是0,剩下的全是1。
然后发现如果两列一直有限制就是完全相同,把他们合并。最后转化之后若干列之间没有限制,每列可以分裂,对着之前的做法嗯做。
好像写的有点太神秘了,抽空再改吧。
定义一个正整数数组是好的,当且仅当能通过若干次操作变成全 \(0\)。操作的定义是选择一个长度大于等于 \(2\) 的区间减一。
现在给定 \(k\),你需要计算有多少长度为 \(n\),值域为 \([0, k]\) 的数组是好的。
\(n \le 3000, k \le n\)
厉害题
首先观察发现只要任意位置满足 前+后>=i,那就满足条件
dp前缀和优化一下可以做到 n^3
然后更牛的观察是发现相邻两个位置最多有一个位置不合法。
那就只需要记录最后一个位置的值了,转移是所有填数方案减掉上一位不合法的情况,只需要从上上位转移,上上位在转移的时候还没确定是否合法,再往前的位置已经确定合法了,因为我们钦定了上一位不合法,所以上上位转移时一定合法,前缀和一下可以做到 n^2.
真绝了啊,怎么还能一维一维地卷。
发现可以从中间劈开,前后缀分开做。
每次插最小值,处理完两边,最后卷起来。
卷起来左边卷一维,算贡献,右边卷一维,无敌了。
还没写
厉害题,发现每次都是相邻两行或者两列
然后发现行列独立。
做完了。
巨难的题,最后用gf了,不过我没听到gf就掉了。
需要丰富的想象力。抽空做做,感觉还挺好玩的。
怎么是我和lge一起打的那场agc的b。
我感觉我题解写得很烂啊,建议直接洛谷第一篇题解。
很厉害的题。
套路地,进行时光倒流。
考虑对于一种情况什么时候合法,每次覆盖一个相同颜色连续段,如果最终可以覆盖掉 \([1,n]\),那就是合法。
但是直接计数是不好计数的,你要考虑顺序,考虑两次覆盖重叠,相交。。。同一种方案还有不同的覆盖方案。所以我们考虑容斥。
一个不合法的方案形如若干段能被覆盖的和不能被覆盖的段交替出现,交替出现的形式是唯一的,可以直接减掉。
我们计数时要求方案中每个未被覆盖的点,都不能被覆盖(我在讲废话)。
设 \(dp(l,r)\),只考虑 \([l,r]\) 的合法方案数。设 \(f(l,r,p)\) 为,只考虑 \([l,r]\) ,\(r\) 为断点,\(p\) 为上一个跟 \(r\) 颜色不同的断点的染色方案数。
转移要求不能覆盖上一个断点(因为每次加的段肯定最容易覆盖上一个断点),分别考虑上个断点跟这个断点颜色相同还是不同。
\(g(l,r,p) += g(l,i,p) \times dp(i+1,r-1)\)
\(g(l,r,i) += (c-1) \times g(l,i,p) \times dp(i+1,r-1)\)
\(dp(l,r) -= g(l,i,p) \times dp(i+1,r)\)
给定两个集合 \(S_1, S_2\),定义一个长度为 \(3n\) 且仅包含 ABC 三种字符的串 \(s\) 是好的,当且仅当存在一种方案将 \(s\) 划分成 \(n\) 个长度为 \(3\) 的子序列,且这 \(n\) 个子序列都是 ABC、BCA 或 CAB。设 \(n\) 个子序列中 ABC 的个数为 \(x\),BCA 的个数为 \(y\),还要求 \(x \in S_1, y \in S_2\)。
现在有一个长度为 \(3n\) 的字符串 \(s\),字符串中仅包含 ABC? 四种字符,你需要计算将所有 ? 都分别替换成 ABC 三个字符中的某一个的方案,使得串 \(s\) 是好的。
答案对 \(2^{32}\) 取模。
\(n \le 60\)
给定 \(N, V\),求 \(\sum_{T \text{ 是一棵 } N \text{ 个点的有标号无根树}} f(T)\) 对 \(P\) 取模后的结果。
对于一棵 \(N\) 个点的有标号无根树 \(T\),定义 \(f(T)\) 为合法的给每个节点赋权的方案数。令 \(i\) 号点的权值为 \(a_i\),定义一个赋权方案合法,当且仅当对于树上的所有非空连通块 \(S\),都满足:
此处定义 \(\text{mex}(E)\) 为 \(E\) 集合内未出现过的最小非负整数,\(\min(E)\) 为 \(E\) 集合内元素的最小值。特别地,定义 \(\text{mex}(\emptyset) = 0, \min(\emptyset) = V+1\)。
$ n \le 150,V \le 10^9$
我怎么对这个题一点印象都没有
Day4
A 迪艾斯
小 A 有一个正整数序列 \(a\) 和一个质数 \(p\),他现在想让你支持两种操作,共 \(q\) 次:
- 给定区间 \([l,r]\) 和一个正整数 \(x\),要求将区间内的所有 \(a_i\) 都乘上 \(x\)。
- 给定区间 \([l,r]\),问在这个区间内任选若干个 \(a_i\) 并将它们乘起来对 \(p\) 取模能得到多少种不同的结果(允许重复选相同的 \(a_i\),也可以不选。如果一个数都不选,则认为乘积是 \(1\))。
\(n,q \le 10^5 a_i \le 10^{14}\)
用到了阶,然后你会了。考场上拿原根做的。
B 蹦蹦炸弹
等腰直角三角形覆盖
C 做菜
贪心 dp维护slope trick
生命是一张由 \(n\) 个神经节点与 \(m\) 条神经构成的带权有向图,允许存在自环、重边。
一条编号为 \(i\) 的神经 \((u_i, v_i, w_i)\) 单向地连接着两个神经节点 \(u_i \to v_i\),长度为 \(w_i\)。
生命的网络不会过于复杂,对于任意一条简单回路,其包含的所有神经长度之和不大于一个定值 \(B\)。
神经节点在某些时刻会兴奋,定义 \(f(u,t)\) 表示 \(t\) 时刻神经节点 \(u\) 是否处于兴奋状态。
兴奋会沿着神经传导,对于第 \(i\) 条神经 \((u_i, v_i, w_i)\),若神经节点 \(u_i\) 在时刻 \(t\) 是兴奋的,那么其会向节点 \(v_i\) 传递神经信号,使其在时刻 \(t + w_i\) 进入兴奋状态。
神经节点的兴奋状态不会保留到下一个时刻,即神经节点 \(u\) 在进入兴奋状态后会沿其它神经立刻向外传递神经信号;接下来的时刻里,如果没有其它神经向它传递神经信号,则该神经节点会保持不兴奋的状态。
如果在同一个时刻,一个节点进入兴奋状态后其递归地向自身传递了神经信号,兴奋状态也不会保留到下一个时刻。(换句话说,数据中存在边权和为 \(0\) 的简单回路,此时你可以将整条简单回路等效地看作单个神经节点处理。)
生命的伊始,神秘的力量刺激了 \(1\) 号神经节点,使其在时刻 \(0\) 时进入兴奋状态。从此开始无数的时间里,生命的讯号便在神经网络中不息传递着。
在经过葛立恒数个时刻的洗礼后,一位实力强大的 Oier——你,历经千辛万苦,终于抵达了 \(n\) 号神经节点。在那里,你看到生命总是趋于循环。
即,保证经过充分长的时间后,\(n\) 号神经节点以一个固定时间周期依据一定模式重复进入兴奋状态。
现在的你开始好奇,此时 \(n\) 号神经节点的进入兴奋状态的最小周期是多少?
亦即,你需要求出一个最小的正整数 \(p\),满足存在一个有限的非负整数 \(M\),使得
由于 \(p\) 可能很大,你只需要输出 \(p\) 对 \(10^9+9\) 取模后的结果。
一个自然数集,每次可以选择一个数 \(a\),把 \(a, 2a, 3a, \dots\) 都标记,求把 \(1,2,\dots,n\) 都标记的最小次数。
\(n \le 10^9\)
题面贺的Wei_Han的(
发现如果除掉 \(2^x3^y\) 之后两个数还不相同,那他们肯定互不影响了
把相同组的按2,3的幂次建坐标系,每次覆盖一个角,求覆盖这个图像的最小步数。发现图形种类数不多,也不大,状压做一做就过了。
一般无向图最小点覆盖,但是保证任意两点间简单路径长度不超过 10。
\(n \le 2e4,m \le 2.5e4\)
题面还是贺的Wei_Han的(
dfs然后往上状压10个点
神秘注意力构造题???
我感觉我没咋掌握,应该多看看策队题解的图的。。。
一个长为 \(n\) 的序列,宝藏在 \(0\),要运到 \(n\),相邻两点之间的边有颜色,有 \(m\) 个人,每个人有颜色,如果一个人走过一条边有 \(1\) 的代价,每个人可以接力传递宝藏,求最小代价。
\(l \le 6e4,m \le 6e4\)
很厉害的dp题啊。
首先第一个观察是货物只会被当前在他后面的人运,他前面的人已经没用了。
然后那你只需要 \(f[i][j][k][0/1]\) 表示当前位置 \(i\), 后面前 \(j\) 个颜色为 \(0\) 的人被用了,前 \(k\) 个颜色为 \(1\) 的人被用了,现在持箱子的人是 0/1.
\(O(n^3)\) 肯定是不行的啊,那考虑降状态,感觉一下好吧没有感觉,\(j,k\)不会很大,事实上也是如此,因为你找一个人去前面,那说明前面连续颜色很长,大过搬运代价,又是0/1交替往前走,然后就是最多 \(\log(n)\) 人了。
给定一个无向连通简单图,包含 \(n\) 个节点和 \(m\) 条边,第 \(i\) 条边连接节点 \(u_i\) 和 \(v_i\),并带有两个正参数 \(a_i\) 和 \(b_i\)。此外,还给定一个整数 \(k\)。
如果一个大小为 \(m\) 的非负数组 \(x\) 满足以下条件,则称其为 \(k\)-生成树生成器:
- 考虑一个有 \(n\) 个节点的无向多重图,其中第 \(i\) 条边被克隆了 \(x_i\) 次(即有 \(x_i\) 条边连接 \(u_i\) 和 \(v_i\))。可以将该图的所有边划分为 \(k\) 棵生成树,每条边恰好属于一棵生成树。
该数组 \(x\) 的代价定义为 \(\sum_{i=1}^{m} a_i x_i^2 + b_i x_i\) 请你求出 \(k\)-生成树生成器的最小代价。
\(n \le 50,m \le 50,1 \le k \le 10^7,a_i,b_i \le 1000\)
一个非常暴力的做法,直接求 Kruskal。
考虑对于一个选边方案,如何判定。发现只要对于任意点集 \(S\),保证导出子图边数小于 \(k(|S|-1)\) 即可。
感性理解这个是对的,证明似乎是非常困难的,洛谷第一篇题解。
考虑直接贪心加一个权值以下的所有边。但是可能有一些边加多了,不满足条件了,所以我们要动态判定是不是有一个子图不满足条件。
即判断 \(\forall S,|G(S)| \le k(|S|-1)\),考虑最大权闭合子图,如果一条边选了,那两端的点必须选。即判断 \(\forall S,|G(S)|-k|S| \le -k\),边权 \(+1\),点权 \(-1\)。
但是直接求,显然不选任何一个点和任何一条边取到最大值,那我们跑的时候强制钦定一条边流,然后这个题就做完了。
森林,加边删边邻域染色单点查询。 \(n,q \le 2e5\)
你说的对,但是我不会lct,我也不会toptree
不过我还是写了吧,因为是单点查询,所以邻域染色不是真的邻域染色。
时光倒流,先加询问,然后每次邻域染色找离他最近的询问判断更新。
如果没有加边删边是不是可以直接点分树???
给定一个长度为 \(N\) 的非负整数序列 \(A = (A_1, A_2, \dots, A_N)\)。
你可以任意次(可以为 \(0\) 次)重复如下操作:
- 选择一个整数 \(i\) (\(1 \le i \le N-1\)),令 \(v = \min(A_i, A_{i+1})\)。将 \(A_i\) 变为 \(A_i - v\),\(A_{i+1}\) 变为 \(A_{i+1} - v\)。
请你求经过操作后,\(A\) 中 \(0\) 的个数的最大值。
\(n \le 2.5e5,a_i \le 10^9\)
八研部员们排成一列,共有 \(N\) 人。从左到右,第 \(i\) (\(1 \le i \le N\)) 位部员称为部员 \(i\)。当前部员 \(i\) 的电脑能力为 \(A_i\)。相邻的部员间存在“亲密度”这一指标,对于 \(1 \le i \le N-1\),部员 \(i\) 和部员 \(i+1\) 之间的亲密度为 \(B_i\)。所有 \(B_i\) 互不相同。
八研部员们很喜欢“派系斗争”。虽然通常禁止派系斗争,但我们来思考万一发生时会怎样。
假设编号为 \(l, l+1, \dots, r\) (\(1 \le l \le r \le N\)) 的人发动了派系斗争,则会发生如下事件:
- 最初,存在 \(l, l+1, \dots, r\) 共 \(r-l+1\) 个派系,部员 \(i\) (\(l \le i \le r\)) 隶属于派系 \(i\)。其他部员则不属于任何派系。
- 派系 \(a,b\) (\(l \le a < b \le r\)) 之间的亲密度定义如下:任何时刻能证明同一时刻仅有至多一个下标 \(i\),使得部员 \(i\) 属于派系 \(a\),部员 \(i+1\) 属于派系 \(b\)。若不存在此 \(i\),亲密度为 \(-10^{100}\);若存在,则为 \(B_i\)。
- 派系数量超过 \(1\) 时,不断重复以下事件:考虑所有派系对 \((a,b)\) (\(a < b\)),找到亲密度最大的那一对。设两个派系对应成员电脑能力之和分别为 \(s,t\)。若 \(s \ge t\),则 \(b\) 的所有成员全部归入派系 \(a\);否则,\(a\) 的所有成员全部归入派系 \(b\)。消灭成员为空的派系。
由于八研活动在接下来 \(Q\) 天内十分活跃,部员能力和亲密度会频繁变化。第 \(j\) (\(1 \le j \le Q\)) 天发生如下变化:
- 若 \(T_j = 1\),则部员 \(P_j\) 的电脑能力变为 \(V_j\)。
- 若 \(T_j = 2\),则部员 \(P_j\) 和 \(P_j+1\) 的亲密度变为 \(V_j\)。
无论何时都保证任意两个人之间的亲密度互不相同。
喜欢幻想派系斗争的“派系太郎”君,每日都进行派系斗争的思考实验。具体地说,每天结束时,他会设想部员 \(L_j, L_j+1, \dots, R_j\) 开始派系斗争,最终哪个派系能胜出。
请输出每次思考实验的结果。
\(n,q \le 10^5,a_i,b_i \le 10^9\)
Day5
A 容器很爽(P6345)
记得Yes/No用bitset就是了
B 渡船很爽(P9341)
?
C 路径很爽(CF1326F2)
给定一张有 \(n\) 个节点和 \(\dfrac{n \times (n-1)}{2}\) 条边的无向图。边 \((i,j)\) 带权 \(W_{(i,j)} \in \{0,1\}\)。
对于所有 \(0 \le s < 2^{n-1}\),计数满足:
的排列 \(p\) 的数量 \(V_s\)。
\(n \le 18\)
题解
这是人做的题啊,难啊。
首先有一个显然的做法,你可以枚举S,然后dp一遍,每次走一个位置,转移的过程中要记录一下当前用了哪些点,复杂度肯定爆炸了。
然后,你有一个惊人的发现,如果你强制钦定了若干条不交的链,它们的并是全集,那么不管这些链之间是什么排列顺序,答案都是一样的。
所以总的做法是,容斥,分为强制钦定为1和无限制的位置,还原答案只需要fwt一下就可以了。因为连续1的长度的集合相同的方案数相等,你划分数地枚举一下每段1的长度,然后状压做,但是你发现每次新加一个点这太慢了,于是你考虑直接算出来只走1边走过每个集合,然后把他们做不交并,求全集的答案。这更慢了,但是你先别急,你有交集那就并不出全集了,直接并就行,求全集的答案。求单点值可以直接 \(O(2^n)\) 算单点点值,然后就做完了。
这是划分数的表
| n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| P(n) | 1 | 2 | 3 | 5 | 7 | 11 | 15 | 22 | 30 | 42 | 56 | 77 | 101 | 135 | 176 | 231 | 297 | 385 | 490 | 627 |
怎么都注意力惊人啊,感觉也只能打表发现。。。
应该是缺练这种计数的,抽空再推一遍写一写博客和代码。
钦定行钦定列钦定行列
最后还有分步转移。
直接看这篇题解感觉就挺好
P12558
难做 能做 感觉好题 应该写 会了 但是我没有领悟到精髓。。。
P12445
给定正整数 \(N\) 和素数 \(P\)。
对每个 \(K = 0, 1, \dots, N\),求出满足以下条件的简单有向图的数量:
- 图中仅包含 \(i \to j\)(\(1 \le i < j \le N\))的边;
- 满足以下条件的点 \(u\) 恰好有 \(K\) 个:存在 \(1 \to u\) 和 \(u \to N\) 的路径。
只需要输出答案对 \(P\) 取模后的结果。
\(n \le 2000\)
qoj8047
DFS Order 4
agc049e
定义一个长为 \(n\) 的序列的权值为:通过以下操作将序列变成全零的最小代价和:
- 单点加减 \(1\)。代价为 \(1\)。
- 区间加减 \(1\)。代价为 \(C\)。
一共有 \(m^n\) 种可能的序列,每个位置均独立取 \(m\) 种不同的值。求出所有可能得到的序列的权值和。
\(1 \le N \le 50,1 \le C \le N,1 \le K \le 50,1 \le B_{i,j} \le 10^9\)
模拟赛出的题是 \(1 \le N \le 130\)。
怎么完全没听懂还被放模拟赛里了,我真服了
考虑 \(K=1\) 考场上发现包含比交叉更优,然后可以转化成值域层,每层是01,串,dp做就可以了。
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) b[j]=(a[j]>=lsh[i]);
for(int j=1;j<=n;j++) {
f[j]=0x3f3f3f3f3f3f3f3f;
if(!b[j]) f[j]=min(f[j],f[j-1]);
else {
int cnt0=0;
for(int k=j;k>=1;k--) {
if(!b[k]) cnt0++;
f[j]=min(f[j],f[k-1]+min(j-k+1,c)+cnt0);
}
}
}
res+=f[n]*(lsh[i]-lsh[i-1]);
}
然后就不会了。。。我好菜啊。
考虑一共有两种情况,一种情况是从前面接一个区间,一种情况是直接新建一个区间。
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
b[j]=(a[j]>=lsh[i]);
S[j]=S[j-1]+(b[j]==0);
}
for(int j=1;j<=n;j++) {
f[j]=0x3f3f3f3f3f3f3f3f;
if(!b[j]) f[j]=min(f[j],f[j-1]);
else {
f[j]=f[j-1]+1;
int cnt0=0;
for(int k=j;k>=1;k--) {
if(!b[k]) cnt0++;
f[j]=min(f[j],f[k-1]+S[k-1]+S[j]+c);
}
}
}
res+=f[n]*(lsh[i]-lsh[i-1]);
}
写成以上的形式,直接记两种转移的值能贡献的值即可过 \(n \le 50\)
qoj8085
兔子有一个巨大的家。兔子的家有 \(n\) 层,每层都有 \(k\) 个房间。房间间由若干条单向走廊连接,且所有走廊都只从第 \(i\) 层(\(1 \le i < n\))通向第 \(i+1\) 层,不存在跨层或反向走廊。
一条路径指沿着走廊方向,从某个房间出发,经过若干走廊到达另一个房间。如果两条路径满足:不经过任何相同的房间(起点和终点也不能相同),并且不使用任何相同的走廊,则称这两条路径互不冲突。
定义 \(f(i,j)\) 为:从第 \(i\) 层出发、到第 \(j\) 层结束的路径中,最多能选出多少条两两互不冲突的路径?(每条路径的起点可以是第 \(i\) 层任意房间,终点可以是第 \(j\) 层任意房间。)求:
\(n \le 4000,k \le 9\)
这个题是之前核桃考过的题,再做还是不会啊
Day6
80+40+16=136 rk30
被打爆了
感觉在模拟赛节奏上应该改一改
A 消除很爽 P11089
为啥忘了放在字典树上倍增来着???
B 众数很爽
根号分治
给定长为 \(n\) 的序列 \(a\),求该序列中的某一个连续的区间,使得该区间中出现次数最多的元素和出现次数最少的元素的出现次数之差最大。你只需要汇报这个最大值即可。
注意 “出现次数最少的元素” 指的是至少在该区间中出现一次的元素中,出现次数最少的元素。
我咋这么菜我咋这么菜我咋这么菜
根号分治 颜色出现次数
大对大 扫一下,求最大子段和即可
大对小 可以按照小的合并连续段,可以做到O(小的长度)
小对小 较大的出现次数也不超过根号,对于每个 \(l\) 维护一下众数出现次数变化的右端点,每个数胡乱做一下感觉就对。
C 区间很爽 P12608
定义长为 \(n\) 的序列 \(a\) 的一个非空连续子段是合法的,当且仅当其中所有出现过的元素出现次数全相等。
求合法的非空子段个数。两个子段不同当且仅当它们在原序列中的出现位置不同。
\(\sum n \le 10^6\)
题解
分讨哈希题
感觉上这个题就要分治,实际上确实也要分治
考虑假如固定左端点怎么做,我当然知道可以统计一下众数的出现次数,不过我们考虑另一个做法。我们对每个数随机一个哈希值,然后设 \(H_1\) 为每个值重复出现只叠加一遍,设 \(H_2\) 为每个值重复出现叠加多遍,那么一个 \(r\) 合法,当且仅当 \(\exists k , H_2=k \times H_1\),即 \(H_2 \bmod H_1 = 0\)。
现在考虑分治,对着上面的式子开始做。
如果没有一种元素只出现在左边或者右边,那么 \(H_{L1} = H_{R1}\),条件变为 \(H_{L2} \bmod H_{L1} \equiv -H_{R2} \bmod H_{R1} \pmod{H_{R1}}\)
如果存在一种元素只出现在左边,不存在一种元素只出现在右边,那么你统计的时候已经知道出现数的集合和每个数出现次数了,算一算就知道右边哈希值是多少。
如果存在元素同时出现在左边和右边,此时知道的信息也足够多,在右边统计答案,此时知道每个数出现次数,还有多少个数得同时出现在左右两边,那你在左边记录一下非众数的 \(H2\) ,众数出现次数即可。不过注意要排除一个数同时出现在左边和右边的情况。
arc153f
给图,给边染三种颜色,要求出现三色路径 \(n \le 2e5,m \le 2e5\)
第一步转化成不出现,然后大力分讨讨讨讨讨讨。
arc164f
咋说呢我觉得我没有完全理解。
胡乱转化一通发现还是两人最大化自己手上的权值。
如果没有什么子树选完了才能选的限制那就直接拿个堆做就可以了,有这个限制考虑合并。首先感觉一下有正权肯定选正权,如果一个叶子-1连着一个只有一个儿子的+1,那选完-1一定选+1,发现这样干完之后还是得这个人选,那我们直接把这个的权值加到父亲的父亲上。
我感觉我没有完全理解。。。
P6377
o占位,x不需要动,只用动(和),(和)顺序其实也挺确定,跑个dp并起来就行。
arc165f
发现如果区间交叉那顺序一定不变,然后保证这个顺序即可。建图跑拓扑序。
暴力建图边数 \(O(n^2)\)。发现是二维偏序,可以优化建图。
给定整数 \(N, A\)。请计算满足以下条件的 \((1, 2, \dots, N)\) 的排列 \(P = (P_1, P_2, \dots, P_N)\) 的个数,并将结果对 \(998244353\) 取模。
- \(P_1 = A\)。
- 通过重复以下操作,可以将 \(P\) 的元素个数变为 \(2\):
- 选择 \(3\) 个连续的元素 \(x, y, z\)。此时,要求 \(y < \min(x, z)\) 或 \(y > \max(x, z)\) 成立。然后,将 \(y\) 从 \(P\) 中删除。
\(n \le 10^6,A \le N\)
Day7
A ds
?
B count
?
C
给定一个 \(n\) 个点的完全图,边的颜色在 \(1 \sim m\) 中,保证 \(m \ge n-1\)。你需要新建 \(m-n+1\) 个点和若干边,补全成一张 \(m+1\) 个点的完全图,使得新图中每个点的临边颜色集恰好取遍 \(1 \sim m\)。
\(m \le 200\)
题解
好难啊
理论上你能快速判断是不是无解这个题就挺能做了对吧。你只要每次尝试填一下,然后判断新的状态无不无解,如果你不考虑复杂度炸不炸的话。炸了就对着优化就行了。
现在开始考虑啥时候无解,首先一个点连出去的边一种颜色出现了两次是无解。奇数个点是无解。然后我就不会了。
你相当于对每个颜色找到一组完美匹配,并且所有的完美匹配并起来等于全集。
你考虑每次新加一个点,然后考虑它和已有的点的边的颜色,那你每种颜色剩下来的失配点不能太多,不然没加的点不够和他们匹配的(每加入一个点,最多减少1种颜色的失配点)。然后你算出来一个确界,你发现这是充分的,建个图跑流就是了。
但是这题咋想的出来啊???
据说这个题把曹队长和WA90豆沙了。
但是这怎么是蓝题??先不超过n步问出最大值,然后对 \(n/k\) 个值每个问 \(k\) 次。
我们先猜每种情况一定有一种方式问 \(n+1\) 次。
转化一下考虑我们现在要构造 \(n+1\) 个长度为 \(n\) 的01串,满足两两不同,且第 \(i\) 位1的个数为 \(a_i\)。
初始等价类为1,那我们考虑每位增加1个等价类,一个用0一个用1。
???
任给平面上 \(10\) 个点,证明总是可以使用任意多个不相交的单位圆盘覆盖它们。
这集神了。
一种很优的方案可以证出来覆盖率 \(>0.9\)。那撒十个点期望有9+个点被覆盖。那肯定有一个方案覆盖了10个点。
给定一个 \(n \times m\) 矩阵,格子可能是空地或障碍物。你需要标记一些空地,使得每个空地周围的“+”号范围(五个点,即自身及上下左右)都存在标记点。要求标记的数量不超过“空地数量 + 空地周长”的 \(1/5\)。

我们先假如不搞什么边界和障碍物之类的东西,那你发现整张地图可以被以上的图案密铺。
那你把被图形上下左右中覆盖的图分类为1/2/3/4/5,则任何一种,都可以密铺整个地图。所有类点一共 \(nm\) 个,然后总共覆盖了 \(5nm\) 个点,那至少一个 \(\ge 1/5nm\)。
那我们考虑有障碍物的情况,如果一个位置在一种情况中被障碍物位置覆盖,那直接将这种情况的中当前位置放标记点,此时所有方案一共放了 \(\text{空地个数+周长}\),总共覆盖了 \(5 \times \text{空地个数}\) 一定有一种方案合法。
很厉害,考虑所有3进制数,我们将所有位加和%3为0的取出来,这些数至少差两位,你选一个数,那立刻把他的补集的数也选了,如果一共奇数个数,那就再选全0.

\(n,m,h \le 50,\text{块数} \le 4e5\)
把每列拉远,然后连起来就可以了。
若干可以优化常数的地方。。。不过应该都不难不写了。。
四面封闭还能做吗?
五面封闭还能做吗?
Day8
A
给定一个 \(1 \sim n\) 的排列 \(a\)。对于一个 \(1 \sim n\) 的排列 \(b\),定义权值 \(f(b)\) 为,最少进行多少次如下操作,才能把 \(a\) 变成 \(b\):
- 交换两个位置相邻但值不相邻的元素(即 \(|a_i - a_{i+1}| \ge 2\))。
特别地,若不可能变成 \(b\),则 \(f(b) := 0\)。
求所有排列 \(b\) 的 \(f(b)\) 之和,对 \(10^9 + 7\) 取模。
\(n \le 100\)
我为什么不会来着
题解
我们将逆序对拆成只考虑某两个数 \(x,y\),从小到大插入数字,插入时考虑当前数和上一个数的位置关系,那么只需要记录当前数插到了哪个位置,因为还要关心 \(x\) 和 \(y\) 的位置关系,所以还要记录 \(x\) 要插到哪个位置,转移前缀和优化一下就是 \(O(n^3)\),然后对于相同的 \(x\),不同的 \(y\) 的转移可以共享,所以只需要再枚举一个 \(x\),复杂度 \(O(n^4)\)。
B
有一个环形数组 \(a_{1 \sim n}\)(即认为 \(n\) 与 \(1\) 相邻)。一次操作可以将一个元素减一,并将一个相邻元素加一。每个 \(i\) 有目标 \([l_i, r_i]\),求让所有 \(a_i\) 都落在目标范围内的最小操作次数。保证有解。
\(n \le 2 \times 10^5,a_i \le 10^4,r_i \le 10^5\)
slope trick维护dp
三分破环边,slope trick+对顶堆维护。
C
称一对数组 \(a_{1\sim n}\) 和 \(b_{1\sim m}\) 合法,当且仅当:
- \(a_i, b_j \in [0, 2^k - 1]\)。
- \(a\) 中元素互不相同,\(b\) 中元素互不相同。
- 对于 \(1 \le i \le \min(n, m)\),有 \(a_i \ne b_i\)。
- \(a\) 中所有数的异或和等于 \(b\) 中所有数的异或和。
求有多少种合法的数组对 \((a,b)\),对 \(10^9 + 7\) 取模。
\(T\le 30,n \le 10^6,k \le 10^9,3s\)
题解
先考虑 \(m=0\) 怎么做,那么这个是经典问题。
选出 \(n\) 个数,让他们异或和为 \(0\)。考虑设 \(f(n)\) 为长度为 \(n\) 的答案,就是随便选 \(n-1\) 个不同的数,然后最后一个值就被确定了,现在只可能前面 \(n-1\) 个数的其中某一个和最后一个数重复,那么去掉这两个数,剩下的数异或和还是 \(0\),得到递推式 \(f(n)=(2^k)^{\underline{n-1}}-(2^k-n+2)f(n-2)\)。
如果 \(m>0\),那么可以先枚举 \(a,b\) 共有 \(t\) 个数同时在 \(a,b\) 中出现,然后剩下的问题实际上是一个错排问题。我们考虑先在较短的串 \(b\) 中选出哪些位置的数同时在 \(a,b\) 中出现,然后把这些位置排到最前面,我们需要考虑 \(b\) 中前 \(t\) 个数,这些位置和 \(a\) 中的哪些位置相等。此时的限制相当于要选出 \(t\) 个 \(1 \sim n\) 的数,然后这些互不相同,且不能放在对应位置上。我们将这个长 \(t\) 的序列补全成长 \(n\) 的序列,就相当于一个排列,前 \(t\) 个数字有限制,后 \(n-t\) 个位置没有限制,最后方案数除 \((n-t)!\) 即可。

然后我们设 \(g(x,y)\) 为长 \(x\) 的排列,前 \(y\) 个位置错排,我们此时要求的就是 \(g(n,1 \sim m)\)
考虑最后一个有限制的位置和哪个位置匹配,得到方程 \(f(n,m)=(m-1)f(n-1,m-2)+(n-m)f(n-1,m-1)\)
考虑最后一个没有限制的位置和哪个匹配,得到方程 \(f(n,m)=mf(n-1,m-1)+(n-m)f(n-1,m)\)
qoj1650
定义一个数组合法,当且仅当能够划分成两个子序列,是的其中一个的And(&)等于另一个的Or(l)。
给定静态数组,多次查询区间合法性
题解1
考虑对于一个最终的答案 ans,那么 popcount(x) < popcount(ans) 都要选进 or 的集合里,而 popcount(x) > popcount(ans) 都要选择到 and 的集合里,你枚举一下 popcount check 即可题解2
考虑 $x | y \ge x$,$x \& y \le x$,那么最终按照从大到小排序后,一定是一个前缀or,一个后缀and,变化次数不太多,维护一下即可CF2210F
对于数组 a,定义权值为:对所有数组 b,满足每个 \(b_i\) 是 a 前i位的 max 或 min,b的逆序对最大是多少。
给定静态排列,多次查询区间权值。复杂度2log。
题解
首先发现只有min-min max-min 会产生贡献从后往前考虑,首先最后一个数肯定取min,然后再考虑倒数第二个数,如果倒数第二个数的前缀min>倒数第一个数的前缀min,那你取min一定不劣。进一步的,如果接下来前缀min变化了,前一个数选min一定不劣,那你只需要考虑,前缀min没有变化的情况,也就是同一段内的情况。
对于同一段内的情况,
剩的题
Day1T1 钟型图灵机
Day1T2 神秘数据结构 等价类分治
Day1T3 支配对,但是KDT
Day2T1 神秘东西维护期望根号的东西
Day2T2 给图,转环求循环节 70pts
Day2T3 神秘字符串border算贡献 72
Day3T2 等腰直角三角形覆盖 √
Day3T3 做菜 贪心 dp维护slope trick
Day6T2 根号分治 √
Day7T3 匹配 √
Day8T2 slope trick维护dp 可能是会了??其实应该写一写的
感觉博客抄Wei_Han的就对了(((
写题解的时候发现怎么这么多题。。。

浙公网安备 33010602011771号