Recent 做题记录(你先别急)
略去了部分非常困难的题目,找个时间补一下。
2023.06
CF407E
线段树入门题,可以提升对于单调栈均摊维护的理解能力,和线段树二分水平,感觉只有 *2500
P7735 [NOI2021] 轻重边
谔谔题,已经忘了怎么做了,后面发现把边的轻重转到点权是否相同即可。
P6109 [Ynoi2009] rprmq1
很涩的题,可以提升对于二区间合并的代码理解能力,代码贺的题解的。
2023.07
P8860 动态图连通性 发现我们给每条边编号之后,只需要维护一条字典序最大的 的路径即可,跑 Dijkstra,然后用主席树维护路径有哪些边的哈希值。
有点抽象,扔个代码:
Code
#include<bits/stdc++.h> using namespace std; const int N=5e5+5; int n,m,q,tot,a[N],rt[N],ans[N],tim[N],Q[N]; struct node{int lc,rc,v,cnt;}t[N<<6]; #define k1 t[k].lc #define k2 t[k].rc #define mid ((l+r)>>1) void change(int &k,int p,int l,int r,int x,int v){ t[k=++tot]=t[p]; if(l==r) return t[k].v=v*a[l],t[k].cnt=v,void(); if(x<=mid) change(k1,t[p].lc,l,mid,x,v); else change(k2,t[p].rc,mid+1,r,x,v); t[k].v=t[k1].v^t[k2].v; } int cmp(int x,int y,int l,int r){ if(t[x].v==t[y].v) return 2; if(l==r) return t[x].cnt<t[y].cnt; if(t[t[x].lc].v!=t[t[y].lc].v) return cmp(t[x].lc,t[y].lc,l,mid); else return cmp(t[x].rc,t[y].rc,mid+1,r); } struct cmp1{ bool operator()(int x,int y)const{ return cmp(rt[x],rt[y],1,m)==1; } }; set<int,cmp1>p; #define PII pair<int,int> #define mp make_pair vector<PII >g[N]; int vis[N]; void dij(int s){ p.insert(s); rt[s]=0; while(!p.empty()){ int x=*p.begin(); p.erase(p.begin()); if(vis[x]++) continue; for(auto v:g[x]){ int t=0; change(t,rt[x],1,m,tim[v.second],1); if(rt[v.first]&&cmp(t,rt[v.first],1,m)==1) p.erase(v.first),rt[v.first]=t,p.insert(v.first); } } } void calc(int k,int l,int r){ if(!k) return; if(l==r) return ans[l]=t[k].cnt^1,void(); calc(k1,l,mid),calc(k2,mid+1,r); } signed main(){ srand(time(0)); ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>m>>q; for(int i=1;i<=m;++i) a[i]=rand()*rand()*rand(); int x,y,z; for(int i=1;i<=m;++i) cin>>x>>y,g[x].push_back(mp(y,i)); int cnt=0; for(int i=1;i<=q;++i) ans[i]=1; for(int i=1;i<=q;++i){ cin>>Q[i]; if(!tim[Q[i]]) tim[Q[i]]=++cnt; } for(int i=1;i<=m;++i) if(!tim[i]) tim[i]=++cnt; for(int i=1;i<=m;++i) change(rt[0],rt[0],1,m,i,1); for(int i=1;i<=n;++i) rt[i]=rt[0]; dij(1); calc(rt[n],1,m); for(int i=1;i<=q;++i) cout<<ans[tim[Q[i]]]<<endl,tim[Q[i]]=0; }
CF1762F Good Pairs
不错的 DS 优化 dp 题,可惜当时只会看题解,纯傻逼,难度对标 NOIP 联考 T2.5
P2824 [HEOI2016/TJOI2016] 排序
颜色段均摊+线段树合并+线段树分裂板子。
CF1771F
入门的主席树维护哈希题,比 P8860 简单多了。
[ARC159D] LIS 2
简单 DS 优化 dp,但是给了当时唐氏的我一种还不错的感觉,谔谔。
P2150 [NOI2015] 寿司晚宴
不错的状压+根号分治题目,可以做到 。
CF1805E
至少让我知道删除一个区间可以倍增全序列然后变成询问一段区间,但是看起来常数不怎么样。
P2305 [NOI2014] 购票
教会了我出栈序,看起来有点用,但但是除了这个题就没见过了,谔谔。
P6773 [NOI2020] 命运
很好的线段树合并优化 dp,但是我还是没做过几道这样的题,不然可能 NOIVP 时就过了D2T2 了,找个时间把 Minimax 做了。
P4770 [NOI2018] 你的名字
SAM 好题,记得当时 SAM 水平还有一些的,还可以做一些比如 P4094,CF666E 之类的东西,现在写不出来板子了,谔谔。
P4841 [集训队作业2013] 城市规划
计数开始的地方,首先对于有标号图的生成函数为 ,连通图的为 ,则:
P6292 区间本质不同子串个数
不怎么需要脑子,直接树上颜色段均摊一下就完了。
没啥意思。
2023.08
P9520 [JOISC2022] 监狱
倍增优化建图板子。
当时代码就贺题解,今天 NOIVP 时被回旋镖了。
但似乎用个环的 hack 把自己叉了更为抽象一些。
CF1296F Berland Beauty
树上并查集板子。
这下只差一个结论就可以通过 NOID1T3 了。
怎么我当时还写的 的,不好评价。
这个月怎么在当 flow 高手,不能要了。
2023.09
P5304 [GXOI/GZOI2019] 旅行者
首先有无脑二进制分组 做法。
但是实际上可以分析每条边的作用做到 。
P5068 [Ynoi2015] 我回来了
模拟赛场切了,感觉自己非常帅,现在再也帅不起来了。
发现每一种 的伤害值种类只有 对,放到线段树上打标记,遇到一个怪就回收即可。
时间复杂度 。
CF1051G Distinctification
不错的题目,发现代价就是:
然后我们对于每个 连续段开一颗线段树维护即可,每次增加一个 就考虑和其他部分合并连续段,这个可以用线段树合并维护,现在看来也不是很难。
P5327 [ZJOI2019] 语言
我们考虑对于每个点,我们能到达的一定是一个连通块,然后我们考虑对于每个点维护出连通块的点数,然后这个虚树的点数我们是众所周知的 dfn 排序后相邻的加起来除 ,然年后我们线段树维护 dfn 数组,然后线段树合并即可。
P5416 [CTSC2016] 时空旅行
拍成搜索树后发现是子树插入,拍成 dfn 区间,考虑线段树分治,对于每个线段树节点维护凸包,然后我们发现可以把插入的点和询问都按斜率排序,这样就是一个 的了。
P5073 用了同样的方式处理询问。
P7220 [JOISC2020] 掃除
感觉这个题还是很厉害,把每个灰尘的存在时间拆成 个区间就可以避免插入了。
然后内部的计算你画一画发现可以通过维护一些东西导致 两维独立,然后就可以做了。
第一个技巧可以用在 P8264 上,这样就可以通过可持久化平衡树做到 。
也可以用在 PKUSC2024 D2T2 上,当然那个题直接扫描线做完了。
P6240 好吃的题目
二区间合并板子,看起来很涩。
CF603E Pastoral Oddities
结论:
存在一组边集使得每个点度数为奇数,等价于所有连通块大小都是偶数。
然后随便线段树分治做一下就好了。
P8078 [WC2022] 秃子酋长
回滚莫队板子题,不准备学 做法了。
[ABC077D] Small Multiple
所有的正整数都可以从 开始经过若干次 和 得到,所以我们从对于每个 ,连边 ,边权分别是 ,然后跑 01bfs 即可。
CF1305G Kuroni and Antihype
我们对于第一个节点加一个虚点父亲,则最后答案就是
最后将答案减去 即可,此时贡献的形式变得十分好看。
然后我们考虑把点的贡献转到边上,每条边的贡献是 ,然后求最大生成树即可。
然后第一种做法是对于每种边权暴力枚举子集,并查集合并,然后就是 的。
或者我们考虑 Boruvka,然后高维前缀和维护即可。
P5386 [Cnoi2019] 数字游戏
我们对于序列莫队,然后用一种数据结构维护值域,每次需要查询区间每个连续段的 之和。
我们有 次修改, 次询问,分块后可以做到 。
AT_abc240_h [ABC240Ex] Sequence of Substrings
我们考虑暴力,提出所有子串,然后字典序排序,然后扫描线即可。
但是你发现,我们最大的子串长度一定只有 ,原因是这个子串不可能比前一个长 的长度。
所以我们提出所有长度小于等于 的子串,然后跑上面的流程即可,时间复杂度 。
P4630 [APIO2018] 铁人两项
先建出圆方树,我们发现,知道 时, 的数量就是 到 所有简单路径的并的大小 。
由于圆方树性质,我们知道这就是中间所有点双的并的大小和 。
然后我们把方点赋值为点双大小,圆点赋值为 ,然后就可以容斥掉圆点同时在多个方点的贡献了。
P9139 [THUPC 2023 初赛] 喵了个喵 II
有点困难,忘完了。
看完题解,我会了!
我们首先考虑对于对于一种数,设其出现位置是
。
然后我们只有 三种匹配方法。
我们可以证明最后一种可以被前面的代替,设我们目前是:
则序列 是:,序列 是 ,然后我们可以把 ,交换,然后 对应位置换换就行了。
然后我们此时只有两种取值了。
然后我们考虑 2-SAT,如果对于两个数 的某组匹配,满足 ,则说明两者不能同时选择这种匹配,然后主席树优化建图即可。
P5610 [Ynoi2013] 大学
简单题,现在看起来也不有趣,对于每种权值维护并查集,然后瞎写就完了。
P6772 [NOI2020] 美食家
矩阵快速幂,记住矩阵乘向量是 的,则我们拆点后可以预处理矩阵的 倍,然后复杂度就变成了 。
P5574 [CmdOI2019] 任务分配问题
决策单调性分治板子。
P6246 [IOI2000] 邮局 加强版 加强版
猜测答案凸性,先来一手 wqs 二分。
然后再观察转移函数发现决策单调性,启动李超线段树, 做完了。
[ABC246Ex] 01? Queries
DDP 板子,不是很有趣。
P5443 [APIO2019] 桥梁
很涩的按时间分块题。
首先按时间分块一手,然后把这个块里需要修改的边不考虑,对于其他的边扫描线,然后处理一个询问的时候,暴力查询这 个属于这个块的边是否加入,并查集维护。
对于每次修改了边后我们可以归并维护这些边,时间复杂度可以做到 。
P6344 [CCO2017] Vera 与现代艺术
考试没做出来,你分析一手,发现就是二进制位下一段后缀为 的部分加,这个可以把询问挂在 Trie 上,然后 dfs 一遍维护即可。
CF258E Little Elephant and Tree
第一眼看到:什么逆天题。
然后后面发现实际相当于四次矩阵加,然后每次询问一行有值的位置个数,维护最小值,最小值个数即可。
P4370 [Code+#4] 组合数问题2
不难发现:
所以对于每个 ,维护当前最大能去取的 即可,然后优先队列维护。
还有个问题是太大了无法比较,我们可以取对数,然后就可以直接比较了。
P4383 [八省联考 2018] 林克卡特树
首先把问题变成 最大化 条不相交的链的链上边权总和,感性证明这个东西有凸性,然后 wqs 二分+树形 dp 即可。
AT_arc069_d [ARC069F] Flags
二分一手,然后线段树优化建图+ 2SAT 即可。
很不优美,我们考虑按二分的距离 分块,则每次是对一个块的前缀和后缀连边,前缀和优化建图即可,时间复杂度 。
有更帅的 做法
2023.10
P5666 [CSP-S2019] 树的重心
我们考虑每个点作为重心的次数。
先拿重心为根,则我们发现,如果 要在割掉某条边后变成重心,则这条边一定不在子树内。
设 ,另外一个连通块大小为 。
则我们满足
即:
所以我们只需要对于每个 ,维护有多少条边满足:
1.。
2.边不在 子树内。
这个可以简单维护。
然后对于重心的答案简单考虑一下即可。
P5043 【模板】树同构([BJOI2015]树的同构)
树哈希板子。
有一大堆计数题后面单开一个。
P6620 [省选联考 2020 A 卷] 组合数问题
普通幂转下降幂板子,斯特林数。
随便推一下:
先通过:
把 转成下降幂函数:
然后推式子:
然后瓶颈在于普通多项式转下降幂多项式,可以做到 ,但是这题模数很臭,直接做 即可。
AT_arc033_4 [ARC033D] 見たことのない多項式
插值板子,我们考虑牛顿插值
woc 我特么不会做了,什么傻逼
首先我们对于牛顿级数,有:
然后就可以做线性插值了。
我测,怎么还写了一些数论题,还有线性代数,先鸽了。
P7011 [CERC2013] Escape
我们遍历一遍树,然后把每个节点的影响变成一个二元组 表示 达到 时可以增加 ,且 ,否则我们认为其不合法。
但是直接维护所有二元组就可能会出现先得到了 子树的二元组再得到 的情况,这是不合法的。
我们在树上 dfs 一遍,设此时节点为 ,然后把 儿子维护的集合合并起来,然后考虑 的贡献:
- ,我们可以直接往集合里扔一个 。
- ,这一部分我们需要讨论
-
- 初始让两个变量 ,
- 然后不断从维护集合里面拿出 中 最小的二元组,然后令 ,删除该二元组。
- 如果集合不为空且(集合中最小的 或者 )那么就继续合并,否则判断 cur 是否大于 ,如果是就把 放在集合里去
这个合并找最小值的操作可以用左偏堆实现,。
CF1100F Ivan and Burgers
前缀线性基板子题。
P6406 [COCI2014-2015#2] Norma
扫描线板子,可以轻松拓展到区间所有子区间求值。
CF809D Hitchhiking in the Baltic States
我们考虑最长上升子序列的做法,维护 表示当前长度为 的上升子序列的最后一位的最小值,则:
- 。
- ,。
首先我们不难发现 序列是单调的,所以操作 相当于区间 ,然后集体平移一位。
然后因为 ,所以我们一定能找到一个 ,然后在后面插入 。
以及找到最小的 的数,删除。
P5537 【XR-3】系统设计
不错的哈希题目,我想想怎么做。
首先我们维护从根到每个点的哈希值,这样我们可以快速算出一个点经过区间的修改后到了哪个点,只需要哈希值结合起来就行了。
然后我们直接线段树上二分即可,时间复杂度 。
贴个代码。
Code
#include<bits/stdc++.h> #define ull unsigned long long using namespace std; const int N=5e5+5; ull base=1e9+7,pw[N],dp[N]; int a[N],f[N],n,m,q,rt; vector<int>g[N]; inline void add(int x,int y){g[x].push_back(y);} void dfs(int x){ sort(g[x].begin(),g[x].end()); int cnt=0; for(auto y:g[x]) dp[y]=dp[x]*base+(++cnt),dfs(y); } namespace Hash{ const int mod=7e5+7; ull val[N]; int ne[N],head[mod],tot; inline void add(ull v){ int x=v%mod; val[++tot]=v,ne[tot]=head[x],head[x]=tot; } inline int find(ull v){ int x=v%mod; for(int i=head[x];i;i=ne[i]) if(val[i]==v) return i; return -1; } } #define k1 (k<<1) #define k2 (k<<1|1) #define mid ((l+r)>>1) ull val[N<<2]; void build(int k=1,int l=1,int r=m){ if(l==r) return val[k]=a[l],void(); build(k1,l,mid),build(k2,mid+1,r); val[k]=val[k1]*pw[r-mid]+val[k2]; } void change(int x,int v,int k=1,int l=1,int r=m){ if(l==r) return val[k]=v,void(); if(x<=mid) change(x,v,k1,l,mid); else change(x,v,k2,mid+1,r); val[k]=val[k1]*pw[r-mid]+val[k2]; } struct node{ int id,l,r; }; vector<node>S; void find(int k,int L,int R,int l,int r){ if(L<=l&&R>=r) return S.push_back({k,l,r}),void(); if(L<=mid) find(k1,L,R,l,mid); if(R>mid) find(k2,L,R,mid+1,r); } int ask(int k,int l,int r,ull V){ if(l==r) return Hash::find(V*base+val[k]); ull Val=V*pw[mid-l+1]+val[k1]; int p=Hash::find(Val); if(p==-1) return ask(k1,l,mid,V); else{ int ans=ask(k2,mid+1,r,Val); return ans==-1?p:ans; } } inline int ask(int X,int l,int r){ S.clear(),find(1,l,r,1,m); ull Val=dp[X]; for(auto x:S){ int p=Hash::find(Val*pw[x.r-x.l+1]+val[x.id]); if(p==-1){ int ans=ask(x.id,x.l,x.r,Val); return ans==-1?X:ans; } else X=p,Val=Val*pw[x.r-x.l+1]+val[x.id]; } return X; } inline int read(){ int x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x; } inline void write(int x){ int st[20],top=0; do{st[++top]=x%10,x/=10;}while(x); while(top) putchar(st[top--]+48); putchar('\n'); } signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); n=read(),m=read(),q=read(),pw[0]=1; for(int i=1;i<N;++i) pw[i]=pw[i-1]*base; for(int i=1;i<=n;++i){ f[i]=read(),add(f[i],i); if(!f[i]) rt=i,dp[i]=1; } dfs(rt); for(int i=1;i<=n;++i) Hash::add(dp[i]); for(int i=1;i<=m;++i) a[i]=read(); build(); int opt,x,l,r; while(q--){ opt=read(),x=read(),l=read(); if(opt==1) r=read(),write(ask(x,l,r)); else change(x,l); } }
P7880 [Ynoi2006] rldcot
支配点对入门。
2023.11
先写了几天串串,先鸽一下。
P3934 [Ynoi2016] 炸脖龙 I
由于拓展欧拉定理,我们发现这个指数上 的数不需要多少次就会变成 ,然后我们暴力做即可。
P8868 [NOIP2022] 比赛
扫描线+线段树维护矩阵即可。
由于矩阵常数太大,需要拆开。
P9067 [Ynoi Easy Round 2022] 虚空处刑 TEST_105
感觉还可以的一个题。
由于涉及到连通块合并,且不存在分裂,考虑启发式合并。
把每个连通块挂到其深度最小的点上,对于每个节点维护其邻域的跟其不在同一个连通块的连通块颜色,然后考虑经典结论之:
树上维护邻域信息不维护父亲的信息。
原因是菊花图直接似了,这个做法在好几个题中都有用,比如 CF487E 和 P6018
然后就可以做了。
CF765F Souvenirs
支配点对题。
我们对 扫描线,不妨先计算 的贡献。
假设我们扫描线到了 ,然后我们找到第一个满足条件的 ,用 更新贡献,然后我们考虑下一个有贡献的数,假设其为 ,则 。
但这样我们一次也会找到 个点对,我们考虑哪些是有用的。
由于我们已经用 更新过 的贡献,所以有效的话则 ,即 ,不断递归,发现对每个 有用的点对只有 个,总点对数量 个,我们对每个点对扫描线,总时间复杂度 。
CF297E Mystic Carvings
考试场切了,但是先等我研究一下。
P6623 [省选联考 2020 A 卷] 树
Trie 树合并 + 全体 +1 板子,没意思。
CF453E Little Pony and Lord Tirek
颜色段均摊+二位数点板子。
P5066 [Ynoi2014] 人人本着正义之名
有点困难的,我们发现这个形如一些区间左右端点移动,然后对于长度为 的区间我们直接取出来即可,由于颜色段均摊,复杂度正确。
P5608 [Ynoi2013] 文化课
联考的时候做不动了跑来写这个题写了半个上午,调了 inf 年发现是输入的 可以 ,有点沙比了。
首先对于符号的修改,我们可以维护区间所有数的和与积,然后问题主要在于区间值修改成同一个。
我们发现,每一段乘法的连续段的贡献是 , 为连续段长度,这样我们维护每个区间每种连续段有多少个就好了,这是一个自然根号,然后标记下传时可以使用光速幂做到 ,也可以我们归并维护连续段长度,然后不断在上次的基础上使用快速幂,可以证明这是 的。
单次修改时间复杂度 ,总复杂度 。
P9061 [Ynoi2002] Optimal Ordered Problem Solver
首先发现一个点被修改后,就在一条类似阶梯的折线上了。
然后我们考虑询问,首先如果该矩形在阶梯右下角则答案为 。
否则分成在线上的和不在在线上,后面部分是一个带修二维数点,两个 显然无法承受。
考虑容斥,转化成右上角,左边,下边,全部加起来后减去 就是左下角的点数量。
然后右上角一定未被修改,这是一个静态二维数点,而左边和下边分别是线上一段和一个带修二维数点,都可以做到单 。
总时间复杂度 。
可能需要 这个 帮助卡常。
P8518 [IOI2021] 分糖果
首先对于下标扫描线,然后我们相当于有一个折线,有上下界,然后维护最后时候的高度。
我们考虑我们找到最后一次碰壁的时间,如果碰壁,则我们一定存在极差 ,我们找到极差 的最短后缀,维护其最大值和最小值,然后分讨即可。
如果不存在,则我们发现答案就是折线原本的最后高度减去最小值。
P7739 [NOI2021] 密码箱
我们首先发现我们可以用矩阵表示连分数,然后我们发现两种操作都可以用矩阵描述,平衡树维护矩阵即可。
P7560 [JOISC 2021 Day1] フードコート
首先对下标扫描线。
我们先假设队列没有被清空过,如果我们有 个人出去了,则我们查询第 个人即可。
否则如果清空过,最后一次清空一定是前缀最小值,我们维护前缀最小值及其下标即可,然后对于询问线段树二分即可。
2023.12
P4022 [CTSC2012] 熟悉的文章
我们首先对于每个下标 算出最大的能作为后缀的长度,记为 ,则我们有简单 dp:
二分答案 。
然后我们发现左右端点都单调不降,单调队列优化即可。
P5901 [IOI2009] Regions
根号分治简单题。
P4117 [Ynoi2018] 五彩斑斓的世界
由于值域只有 考虑值域上做一些东西。
我们分块,维护区间最大值 ,
- ,则我们将 和 合并,合并 次,最大值减少 。
- 否则我们将 和 合并,合并 次,打上全局减标记,最大值减少 。
所以我们的合并次数是 级别的。
然后我们分块后并查集维护即可。
P6779 [Ynoi2009] rla1rmdq
我们首先分块,对于每个块单独考虑,由于树边权非负,所以一个点祖先的深度一定不比这个点大。
然后如果树上一个点之前就被访问过了,则以后跳到这个点的 就是无用的,可以略去。
这样每个块的均摊代价就是 的,散快每次会带来 个点,所以总复杂度是 的。
P5071 [Ynoi2015] 此时此刻的光辉
考虑按 分治,则每个位置最多只有两个大质数,然后我们对于这些大质数跑莫队,对于小质数前缀和计算答案即可。
P5063 [Ynoi2014] 置身天上之森
我们发现,我们按照节点大小把线段树节点分类,只有 类,然后一次询问对于每种大小的节点的贡献就是:
中间一部分加上 ,旁边两个加上一些。
然后我们发现询问相当于区间有多少个数小于等于 ,这个可以分块处理。
虽然看起来我们要执行 次操作,但是我们分析一下这个 的和,发现并没有多 ,只是常数大了一些。
这样我们就可以 解决问题,如果使用分散层叠就是 的。
P3242 [HNOI2015] 接水果
我们首先把路径的包含关系放在二维平面上,然后我们就是对于每个点查询覆盖了其的第 大,这个东西可以扫描线后树套树解决。
P7561 [JOISC 2021 Day2] 道路の建設案 (Road Construction)
有个巨大难写的 做法,讲一个简单的 做法。
我们二分答案 ,然后平面分块,每个点枚举周围的 个块计算答案,到了 条道路就退出,可以证明,这样单次复杂度是 的。
CF1017G The Tree
我们考虑如果在 处进行 操作,就把 权值 ,初始都是 ,然后我们只需要询问根到点路径上最大后缀和是不是 即可。
然后我们考虑 操作,首先把 子树都变成 ,然后 权值变成 的询问答案 ,这样就屏蔽 的祖先的影响了。
P5314 [Ynoi2011] ODT
我们考虑链分治,对于每个点维护其轻儿子权值集合,则一次修改只会更改 个点。
然后询问的时候插入自己,重儿子,父亲即可。
时间复杂度 。
更好一点的办法是每个点抛弃其前 大的子树,维护剩下的部分,修改次数为 。
总时间复杂度为 。
可以用平衡树多树二分科技做到 。
P8528 [Ynoi2003] 铃原露露
我们将问题转化以下,区间 满足要求当且仅当 ,我们需要支持询问一个区间有多少子区间满足条件。
我们考虑对于一个三元组 ,不妨设 。
- ,则 的区间不合法。
- ,则 的区间不合法。
- 否则对答案没有影响。
我们只需要对于每个 找出其前驱后继即可。
但是我们能找出的是不合法的区间,我们考虑如何计算合法的区间,我们把问题放到二维平面上看,那么我们就相当于 次矩形 ,然后询问一个矩形中有多少个 。
我们发现, 是最小元素,那么我们维护最小值和最小值个数即可,由于我们是矩形询问,还需要个线段树历史版本和。
时间复杂度 。
AT_arc132_e [ARC132E] Paw
我们观察最终形态一定形如:<<<<....>>>>
考虑 个间隔都变成 <
且影响右边的概率,设为 。
第一次操作除了最后一个变成 >
都能接受,所以 。
我们枚举作为 ...
的间隔,则答案为:
直接统计即可。
CF1610H Squid Game
首先,对于非直链,我们可以使用一次 ,这样他们就全寄了。
然后我们考虑设每条链分别是 ,我们按 从大到小排序,然后如果这条链还是不满足条件,选取 路径上第二个点即可。
然后我们判断这样所有非直链是否全被覆盖,如果没有就增加一个 。
这样我们就做完了。
CF839E Mother of Dragons
首先我们发现我们一定导出一个完全图,证明容易。
转化成求解最大团,然后我们写一个暴搜,记忆化后发现能过,为什么呢。
前面 个点只有 种决策,后面只有 种状态,所以复杂度为 。
P5324 [BJOI2019] 删数
如果数字 有 个,则我们覆盖区间 , 没有被覆盖的位置和就是答案。
然后单点修改和区间平移一个可以线段树维护,一个可以打 。
P7215 [JOISC2020] 首都
如果我们 的两个点中间经过了一个 ,则我们把必须把 合并。
我们考虑点分治,我们考虑令分治中心所在城市连通,然后队列维护。
如果有点不在当前连通块,说明这一层答案一定不如上面的优秀,退出即可。
AT_arc154_e [ARC154E] Reverse and Inversion
很奇怪的题。
我们先推一下式子:
然后我们对于每个数算出最后位置的期望 ,则答案为:
然后我们发现对于 ,把他挪到 的方案和挪到 的方案一样多,所以被操作过之后期望位置就是 。
如果没被任何操作包含,概率为 ,则期望为 ,否则为 ,直接统计答案即可。
P7897 [Ynoi2006] spxmcq
我们维护每个连通块的权值 ,然后用堆维护 ,每次修改拿出一些堆顶修改了即可。
P5336 [THUSC2016] 成绩单
由于我们代价只和区间中的 有关,所以设 表示剩下的最值为 的代价。
P3642 [APIO2016] 烟火表演
slope trick 基础练习题,我们暴力 dp,设 表示 子树里面所有叶节点到 的距离为 的最小代价,然后转移是简单的。
P4827 [国家集训队] Crash 的文明世界
先套路斯特林数展开成为下降幂,然后考虑发现后面的下降幂变成组合数后可以递推,最后换根一次就可以了。
存在一些北京集训的困难题鸽了。
P4242 树上的毒瘤
我们建出虚树,然后虚树边权设为这段链上颜色段数 ,然后我们不难发现此时 的颜色段数就是虚树上路径的权值和 ,然后换根 dp 即可。
P4747 [CERC2017] Intrinsic Interval
首先我们要知道一个结论,如果存在两个 "区间" 有交,则 也是一个 "区间",证明可以感性理解。
然后这样我们只需要对于每个 ,先找到一个 满足存在一个 ,然后找到最大的 即可,这个可以扫描线维护,然后把询问按 放到堆里,最后线段树二分即可。
2024.01
CF960G Bandit Blues
我们设 表示长度为 的序列,有 个前缀最大值的个数。
然后每次加入一个最小值,得到:
这不是我们第一类斯特林数吗,然后我们考虑计算答案,枚举全局最大值位置,得到:
由于斯特林范德蒙德卷积,我们就知道:
CF838D Airplane Arrangements
序列很丑,所以我们考虑加上 变成环,然后每个点被覆盖的概率是一样的,然后我们需要 不被占,概率为 ,乘上总方案数即可。
P5163 WD与地图
倒序考虑,整体二分出每两个强连通分量多久合并,然后线段树合并维护。
CF660E Different Subsets For All Tuples
我们考虑枚举子序列长度,设为 ,然后每个数分别出现在 处,则我们就知道总方案数为:
后面计算是简单的。
P4183 [USACO18JAN] Cow at Large P
首先我们对于每个节点,找到离其最近的叶子的距离,记为 ,然后我们定下根为 ,对于一个点 ,他会贡献的条件是 ,且如果 被 贡献就不用进入其子树。
考虑点分治,这样一个点 对于另一个联通块的 的贡献条件就是:,但是我们发现如果一个 产生了 的贡献,那么其子树内每个点都有 的贡献,这很不好,我们考虑重新赋权值,变成 ,这样一个子树权值就只有 了,然后 只有 ,这样我们就 解决了问题。
CF914F Substrings in a String
分块 SAM?太困难,直接 bitset 优化串串匹配即可,复杂度 ,直接过。
[ABC276G] Count Sequences
我们考虑计算差分数组,则 ,然后我们枚举 的个数即可知道 的个数,然后我们可以往中间插入 ,这个可以插板法解决,然后就做完了。
P5311 [Ynoi2011] 成都七中
我们考虑暴力怎么做,我们是从 开始 dfs,然后计算颜色数。
我们换种思路暴力,我们设 是 保留那些节点后所在连通块深度最小的节点,那么我们发现每个子树内的节点是否贡献可以转化成对于所有 的询问贡献的问题,然后我们发现这个问题已经和 无关了,而复杂度跟 所在连通块大小有关。
我们考虑点分治,那么我们需要对每个询问找到第一个满足连通的分治中心,这个可以每次分治中心暴力从 dfs 记录沿途的编号最值判断。
然后我们记录分治中心到连通块内每个节点的沿途最值,不妨设对于节点 ,其为 ,那么 对询问 产生贡献的条件就是 ,然后我们扫描线即可。
时间复杂度 。
CF1025G Company Acquisitions
CF1349D Slime and Biscuits
CF850F Rainbow Balls
CF1479E School Clubs
这 个题都是停时板子,我们来推导一下:
第一个题,设每个点后面跟了 个点,设我们选出来 ,然后
取 ,然后直接计算即可。
woc,这么短的式子也配叫停时,等几天换那个题写。
P6640 [BJOI2020] 封印
我们先算出对于每个 ,算出以 为起始的位置和 的最长公共子串长度,设为 ,则我们不难发现:
- ,答案是 。
- 否则答案就是 。
然后我们不难发现这个 是单调不降的,不难证明。
可以 SAM 计算,后面部分可以二分+ ST 表即可。
P7519 [省选联考 2021 A/B 卷] 滚榜
首先我们发现我们不是需要这个分配 个题的方案数,而是最后排名的方案数。
所以我们对于每一种排名计算的时候,可以想办法使用需要题数最小的方法即可。
然后我们考虑 dp 这个过程,设 表示考虑了 集合内的队伍,最后一个队伍是 ,一共用了 次题的方案数。
然后转移的代价不难知道,使用费用提前计算的思想,就是 。
然后 dp 即可。
2024.02
P7481 梦现时刻
计算:
考虑令
然后这个多项式就可以递推计算了。
P4240 毒瘤之神的考验
不香
P5320 [BJOI2019] 勘破神机
不香
P5492 [PKUWC2018] 随机算法
我们先算出最大独立集的大小,然后 dp 每个集合作为答案的概率求和即可。
考虑设 表示变成了 的概率,然后考虑怎么转移:
枚举 集合中的最后一个加入的点 ,则我们需要满足 的概率是所有除去 的邻域中的第一个数,概率为 ,然后 dp 即可。
P6563 [SBCOI2020] 一直在你身旁
区间 dp,考虑设 表示计算区间 的最小代价,则:
看起来决策单调得很啊,但是并不是如此,谔谔。
我们分开分成 和 得两种情况,这两个东西都是单调的,所以我们可以简单的将 的取值分成两个区间。
然后对于每个区间:
- 我们就是询问 ,这个东西我们可以维护一下这个的最值即可。
- 第二种情况是 ,我们单调队列即可。
细节全忘了。
CF573E Bear and Bowling
首先列出 dp 方程, 表示前 个数,取 个的最大权值,则:
然后运用我们聪明的人类智慧,我们可以发现一定存在一个关键点 满足 之前取 ,后面取 ,然后我们可以二分这个部分,然后后面相当于区间平移加上等差数列,平衡树维护,时间复杂度 。
我的代码怎么是贺的啊,流汗。
CF156D Clues
经 典 老 番
考虑 Prufer 序列,对于给定的 序列,我们的方案数为:
然后答案就是:
P3196 [HNOI2008] 神奇的国度
SP5446 FISHNET - Fishing Net
P3852 [TJOI2007] 小朋友
弦图啊,那是什么,我怎么会写过这个。
CF995F Cowmpany Cowmpensation
考虑 dp,设 表示考虑 子树, 的权值是 的方案数,则:
然后我们可以证明,这个 是一个不超过 次的多项式,归纳即可,所以其前缀和是一个 次多项式,我们可以代入 个值,插值即可。
P3643 [APIO2016] 划艇
很牛的 dp 题,考虑设 表示选择 且 派出 艘的方案数,然后我们考虑枚举上一个学校及其出的人数即可。
前缀和优化后是 的,无法通过。
我们考虑离散化值域,我们把值域分成 个段,设 表示 派出的人数在第 个段的方案数。
我们把转移分成两个部分,属于第 个段的学校和不属于第 个段的学校。
后面部分我们可以前缀和优化即可,重点是前面的部分。
我们从 中取出 个数,要求所有非零数严格递增,则方案数是 。
证明:枚举有多少个 :
所以我们枚举上一个选了的学校 ,计算 区间有 个学校包含了 ,则方案数就是 ,因为 必须选。
然后写出 dp 式子发现这个也可以前缀和优化,舒服了。
P8290 [省选联考 2022] 填树
我们发现操作就是将一条链上的每个 的权值变成 中的一个数。
我们考虑暴力,设我们钦定值域区间是 ,且必须取到 ,则我们用 减去 即可。
然后我们考虑我们钦定一个值域区间后怎么 dp:
设 分别表示以 为链的一端的方案数和权值和的和, 表示 lca 为 的链的方案数/权值和, 分别是 节点本身的方案数/权值和。
我们发现除了 之类的 的点的时候,可能每个点的 规律会变化,所以我们按这些点分成 段,每个段 dp 方案的多项式次数只有 次,插值即可。
CF1821F Timber
首先对于判断一个方案,从前往后考虑,如果可以往左就往左,否则往右。
我们设 dp 方程 表示考虑了 棵树,最后一颗占据了 的方案数:
然后转移就是:
- 。
- 。
写成生成函数:
变化一下变成:
然后枚举分子 的次数计算即可。
P7603 [THUPC2021] 鬼街
减半报警器板子。
P6672 [清华集训2016] 你的生命已如风中残烛
不香
P5644 [PKUWC2018] 猎人杀
首先不难发现,如果我们每鲨一个人就改变分母,非常困难。
我们把问题变成每个人被鲨的概率是 ,然后不断杀杀杀直到杀到一个活着的人。
然后我们考虑设 死后活着的人集合为 ,设 为恰好活了 的概率, 为 内每个点都活着的概率,则:
然后我们要计算 。
考虑如何计算 :
我们考虑这就相当于每天可以打中 或者除去 以及 的点
然后分治 FFT 计算 的贡献系数即可。
CF600F Edge coloring of bipartite graph
二分图最小边染色,结论是点的最大度数。
构造采用调整法,贴个代码:
Code
#include<iostream> using namespace std; const int N=2e3+5,M=1e5+5; int a,b,m,u[M],v[M],deg[N]; int ans,c[N][N]; signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>a>>b>>m; for(int i=1;i<=m;++i) cin>>u[i]>>v[i],v[i]+=a,++deg[u[i]],++deg[v[i]]; for(int i=1;i<=a+b;++i) ans=max(ans,deg[i]); for(int i=1;i<=m;++i){ int c1=1,c2=1; while(c[u[i]][c1]) ++c1; while(c[v[i]][c2]) ++c2; c[u[i]][c1]=v[i],c[v[i]][c2]=u[i]; if(c1==c2) continue; for(int t=c2,w=v[i];w;w=c[w][t],t^=c1^c2) swap(c[w][c1],c[w][c2]); } cout<<ans<<"\n"; for(int i=1;i<=m;++i) for(int j=1;j<=ans;++j) if(c[u[i]][j]==v[i]) cout<<j<<" "; }
AT_abc134_f [ABC134F] Permutation Oddness
费用提前计算思想,设 表示考虑前 对,有 对没有配对,代价为 的方案数,然后 dp 即可。
复杂度 。
P4229 某位歌姬的故事
不香
AT_abc242_h [ABC242Ex] Random Painting
容斥,然后随便 dp 一下即可。
CF1838E Count Supersequences
用合法的减去不合法的。
枚举 匹配的长度 ,则方案数是
然后统计答案是简单的。
AT_agc050_d [AGC050D] Shopping
鼎汉 dp,设 表示现在小明左边有 个人,右边有 个人,进行到了 个人,小明选了 次,能拿到物品的概率。
CF1515I Phoenix and Diamonds
逆天倍增分块,我调个集贸啊
AT_abc213_g [ABC213G] Connectivity 2
考虑计算设 表示 作为子图且连通的方案数, 为 作为子图且不一定连通的方案数。
则:
答案统计是简单的。
AT_abc262_h [ABC262Ex] Max Limited Sequence
不香
AT_abc221_h [ABC221H] Count Multiset
设 为考虑了权值 的数,总和为 的方案数,然后转移枚举选的个数,不难发现总数是调和级数的,复杂度 。
P4590 [TJOI2018] 游园会
先不考虑出现 NOI 子串的问题,没有这个限制我们怎么做:
考虑最长公共子序列的 dp 做法,不难发现对于一个 ,其一定不降且相邻两项之差不大于 ,状压即可。
考虑有不能出现 NOI 的限制,直接加一维即可。
P8352 [SDOI/SXOI2022] 小 N 的独立集
首先我们考虑 dp 套 dp,设 为在 子树内,然后 的方案数,观察到 ,使用树形背包,复杂度变成 。
P5284 [十二省联考 2019] 字符串问题
SAM 上子树优化建图。
CF1009G Allowed Letters
每次枚举一个字符,判断这个字符放了之后后面部分是否合法,这个霍尔定理判定即可。
AT_arc076_d [ARC076F] Exhausted?
拓展霍尔定理:
二分图的最大匹配数是 。
证明略去。
我们发现需要添加的椅子数量就是 减去最大匹配数,所以答案就是:
然后枚举不能选的区间扫描线即可。
CF1373G Pawns
由于要走到第 行,此时我们不难发现其 即可。
所以我们就是一个点向一个后缀连边,哎呀我艹我忘了。
P6326 Shopping
点分治,然后 dfn 序背包即可。
AT_arc058_c [ARC058E] 和風いろはちゃん
感觉还是比较牛的题,先用全部减去不合法的。
然后 dp,记录末尾的数形成的有哪些后缀和,转移简单。
AT_arc061_d [ARC061F] 3人でカードゲーム
列出式子递推即可。
P3249 [HNOI2016] 矿区
平面图的划分之类的东西,不香。
AT_arc085_d [ARC085F] NRE
非常香做法,爱来自 houzhiyuan
我们考虑 dp,设 表示考虑了前 个,目前被覆盖到了 的最小代价。
然后考虑转移:
- 。
- 。
对于一个操作 ,我们可以:
。
然后这些都能线段树。
完全胜利。
CF856D Masha and Cactus
我们不难发现,如果我们选择了一条边,则一条边在树上的路径上的点都不能再被经过,所以我们考虑 dp。
设 表示在 子树内瞎选的最大权值,然后维护 ,然后我们就可以在每条路径 lca 处轻松转移了。
CF1681F Unique Occurrences
我怎么写的线性做法,震撼人心。
现在不会了,鉴定为原来没喝明白。
CF739C Alyona and towers
吃多了去年不会做,线段树直接维护即可。
CF1428F Fruit Sequences
有点神秘的题,鸽一下
CF786C Till I Collapse
首先发现答案大小是调和级数的。
然后想怎么做都可以。
CF1096G Lucky Tickets
shaber 题,不知道去年为啥不会做。
CF1139D Steps to One
首先由很一眼的莫反优化 dp,可以做到 ,然后我们考虑一些更好的做法。
然后就可以整除分块+杜教筛做到 。
AT_arc101_c [ARC101E] Ribbons on Tree
子集反演,dp 容斥系数即可。
CF1585G Poachers
不香
2024.03
CF700E Cool Slogans
我学过串串?不香
CF1499F Diameter Cuts
长剖优化 dp 板子。
CF231E Cactus
建出圆方树,然后每存在一个环就有两种方法,树上差分即可。
CF19E Fairy
经 典 老 番
对于这种问题,我们先找出一颗 DFS 树,
然后我们寻找二分图充要条件:不存在奇环。
所以首先我们需要删一条边爆了所有的奇环,我们在 DFS 树上覆盖这些路径上的边。
然后我们一定不被偶环覆盖,否则我们可以异或一下就排除了这条边。
满足这两个条件的边就是合法的。
P3350 [ZJOI2016] 旅行者
分治,每次选更长的边分治,可以证明复杂度是 的。
CF1295F Good Contest
跟划艇一个套路,值域区间离散化后 dp 即可。
P8368 [LNOI2022] 串
不香。
AT_abc246_g [ABC246G] Game on Tree 3
二分答案,简单 dp
CF840C On the Bench
先去掉平方因子,然后容斥即可。
CF1082G Petya and Graph
最大权闭合子图板子。
CF1473F Strange Set
同上
CF464D World of Darkraft - 2
精度要求不高,只保留前 项即可。
CF241B Friends
二分+维护子树内各个二进制位个数即可。
AT_arc137_d [ARC137D] Prefix XORs
lucas 与 的关系。
P3747 [六省联考 2017] 相逢是问候
简单期望 dp,不想写了。
AT_apc001_f XOR Tree
有点有趣的题,把边权转化到每个点上,然后我们相当于每次 异或上 ,
然后先贪心匹配掉相同的,然后状压 dp 即可。
P3321 [SDOI2015] 序列统计
原根+NTT 循环卷积 + 快速幂。
CF1110F Nearest Leaf
树上 DFS + 线段树维护即可。
CF1603C Extreme Extension
状态数只有 ,然后就可以计算了。
P6628 [省选联考 2020 B 卷] 丁香之路
联想到欧拉回路,然后想办法贪心地将图连通且满足度数限制即可。
P7516 [省选联考 2021 A/B 卷] 图函数
找出点对 产生贡献的条件,然后 Floyd 计算能产生贡献的范围即可。
注意要手写 减少常数。
AT_agc017_c [AGC017C] Snuke and Spells
人类智慧题。
CF1140G Double Tree
倍增臭题,不知道为啥去年联考时不会做。
CF1903D2 Maximum And Queries (hard version)
每次尝试确定一位,然后答案计算需要的参数高维前缀和计算。
P7126 [Ynoi2008] rdCcot
钦定代表元。
P7447 [Ynoi2007] rgxsxrs
倍增分块。
CF1936D Bitwise Paradox
维护每个二进制位第一次出现的前缀/后缀,线段树+双指针合并。
CF1935F Andrey's Tree
简单分讨题。
CF1548E Gregor and the Two Painters
很牛的题,寻找支配点。
CF1270H Number of Components
很困难的题,鸽了。
P10218 [省选联考 2024] 魔法手杖
我们也放在 Trie 树上,然后逐位确定,假设我们此时在节点 ,我们需要 这一位为 。
- 假设我们 这位为 ,则我们尽可能要把 里面的数取出来,然后我们要更新 最小值,然后需要 了之后 最小值超过目前的 。
这一位为 时正好相反,然后再上面 dfs 即可。
P8147 [JRKSJ R4] Salieri
简单题,AC 自动机+虚树+二分+主席树
P7357 「PMOI-1」中位数
把 和 都加入扫描线的权值即可。
P8522 [IOI2021] 地牢游戏
倍增分块,比较牛。
P7712 [Ynoi2077] hlcpq
主席树优化建图,比较牛。
AT_abc217_h [ABC217H] Snuketoon
slope trick
CF1534G A New Beginning
旋转一下坐标系,然后 slope trick
CF1588F Jumping Through the Array
不香。
CF1383F Special Edges
枚举修改的边的状态,然后计算最小割。
预处理需要使用退流。
P5470 [NOI2019] 序列
模拟费用流题目,细节很多。
P3347 [ZJOI2015] 醉熏熏的幻想乡
很牛的题。
第一问是简单的。
对于第二问,我们对函数求导即可知道单位函数的代价是 ,不妨设函数 表示当单位费用不超过 时,我们的最大流量是 ,然后我们发现这个函数一定是凸的,且只有 段,如图所示:
黄色部分就是我们的最小费用。
我们考虑了如何求出这个这个函数,首先我们应该能知道边界的两个线段,且我们对于一个 我们可以以跑一次最大流的代价求出 。
我们考虑如何找出所有的断点,我们先找出边界的两个线段的交点,如果在一条线段上说明这是唯一的断点,否则说明我们中间还有若干段函数,分治下去找即可。
由于防止出题人卡,我们也许需要一些微扰,比如加上 eps 之类。
然后求出断点后,求面积是简单的。
[ABC331G] Collect Them All
容斥+分治 FFT 即可。
P9247 [集训队互测 2018] 完美的队列
鸽了。
P10220 [省选联考 2024] 迷宫守卫
我感觉这个题一点也不简单啊,太困难了。
我们首先二分第一个数的范围,不妨我们设第一个数为 ,我们定位出根到 的路径。
然后我们知道此时当前节点 会往哪个节点走。
- 往右子树走,我们需要花费 来使得左子树被封锁。
- 否则,我们需要花费 的代价,使得右子树被封锁或者强制往左走,但是此时并不是如果 更小就一定选 ,而是如果我们走完左子树后,如果我们剩下的权值 ,则我们可以不使用 ,而是使用 ,这样还可以封锁右子树的节点,如果并不大于,则我们可以将权值用在左子树内,一定更优。
这个题很简单吗????
P3813 [FJOI2017] 矩阵填数
把矩阵划分成若干等价类,然后 容斥即可。
CF1416D Graph and Queries
用到主席树前后版本的关系,不错的题。
P4948 数列求和
有限微积分。
P4221 [WC2018] 州区划分
半在线子集卷积。
AT_abc212_h [ABC212H] Nim Counting
FWT 板子。
P6794 [SNOI2020] 水池
有点复杂的可持久化,先鸽一下。
P7172 [COCI2020-2021#3] Specijacija
插入,询问第 个数。
CF1148H Holy Diver
扫描线+颜色段均摊,然后每个颜色贡献是一个一次函数,主席树维护。
P7518 [省选联考 2021 A/B 卷] 宝石
倍增+主席树即可。
P5526 [Ynoi2012] 惊惶的 SCOI2016
LCT ,不香。
P5397 [Ynoi2018] 天降之物
根号分治,有点复杂,忘了,不香。
P3349 [ZJOI2016] 小星星
我们首先考虑 dp,设 表示 子树里面对应了 , 对应 的方案数,转移简单,时间复杂度 ,凉透了。
我们发现这是子集不交并卷积,你可以使用 FWT,做到 ,没有前途。
我们考虑如何避免这个邪恶的卷积,我们抛弃 这一维,但是我们发现就没法保证映射不重复了,难过。
我们考虑容斥,容斥互不相同的限制,我们设 为 子树都取 ,可以重复,但是必须 每个都取到的方案数, 表示去掉 每个都要取到的限制,则我们发现这就是恰好和钦定的关系,所以 ,子集反演得到 ,对于 的计算我们发现可以枚举 后直接计算,时间复杂度 ,常数很小。
P5401 [CTS2019] 珍珠
二项式反演+EGF 简单题。
AT_abc236_h [ABC236Ex] Distinct Multiples
好困难的题,似乎叫做集合不相等容斥
先暴力容斥,不妨设我们我们钦定相同的边集为 ,而我们连通块状态是 ,所以我们的答案就是:
然后我们考虑计算后面一项,不难发现点集内的每个连通块相对独立,所以我们现在需要对于每一个点集,计算每个连通块的贡献之积。
我们现在来计算每个连通块的容斥系数,由于没有联通限制的时候生成函数是 ,所以我们取 得到容斥系数是
然后我们发现最后就是一个 exp 把各个连通块拼起来即可。
讲得很抽象,还是看代码吧:
Code
#include<iostream> #include<cmath> #define int long long #define Int __int128 using namespace std; const int N=16,mod=998244353; int n,m,tot,d[N],lc[1<<N],w[1<<N],f[1<<N]; inline int gcd(int a,int b){return b?gcd(b,a%b):a;} inline int lcm(int a,int b){ Int val=(Int)a*b/gcd(a,b); return val>m?m+1:val; } inline int sig(int x){return x&1?mod-1:1;} inline int fac(int x){return x==0?1:fac(x-1)*x%mod;} inline int count(int x){return __builtin_popcount(x);} signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>m,tot=(1<<n)-1,f[0]=lc[0]=1; for(int i=0;i<n;++i) cin>>d[i]; for(int S=1;S<=tot;++S) lc[S]=lcm(lc[S-(S&-S)],d[__lg(S&-S)]); for(int S=1;S<=tot;++S) w[S]=m/lc[S]%mod*sig(count(S)-1)%mod*fac(count(S)-1)%mod; for(int x,S=1;S<=tot;++S){ x=__lg(S&-S); for(int T=S;T;T=(T-1)&S) if(T>>x&1) f[S]=(f[S]+f[S-T]*w[T])%mod; } cout<<f[tot]<<"\n"; }
CF662C Binary Table
FWT 板子。
P4091 [HEOI2016/TJOI2016] 求和
简单题,推一推就好了。
P6570 [NOI Online #3 提高组] 优秀子序列
集合幂级数 exp 板子。
P4338 [ZJOI2018] 历史
感觉很神秘,我们把 的 当成重边,然后 LCT 直接维护,修改即可。
CF917D Stranger Trees
经 典 老 番。
先来一手二项式反演,然后问题变成询问多少种方案钦定有 条边重复。
我们考虑如果我们已经知道一个钦定集合怎么做,假设我们连完钦定的边后,连通块大小分别是 ,则连通方案数是:,证明也是经典老番。
然后我们考虑怎么维护这个,组合意义启动, 表示每个连通块各选一个点的方案数,所以我们考虑设 表示 子树内,划分了 个连通块, 所在连通块选没选点的方案数。
dp 即可,复杂度 。
CF1149C Tree Generator™
线段树维护括号序即可。
2024.04
P9970 [THUPC 2024 初赛] 套娃
对于每个 ,设其出现下标分别是 ,则我们拉出 这些区间,只有这些区间及其子区间的 mex 可能是 ,然后各种神秘玩意扫扫即可。
AT_arc128_f [ARC128F] Game against Robot
我们先考虑对于确定的 如何求答案。
我们不妨设最后 选的数按 排序后下标为 。
那么 序列合法充要条件是 。
那么我们从后往前扫,维护一个有限队列,每次加入两个数,并取出一个数即可。
由于是枚举了全排列,由对称性可知我们可以将数列翻转,从前往后维护。
然后考虑原问题,可以发现我们选的值 只与 相对大小有关,我们不妨设在所有情况中第 大的数被选中了 次,那么 从大到小排序后
恰好并不好求,我们考虑求出前 大的数在所有情况下一共被选中了 次,那么我们可以把前 大看成 ,剩下的看成 ,最后乘上 即可。
我们设第 次加入的两个数和为 且 ,设 为剩下 的个数,那么 。
设 ,从 出发,每次向右走一格,向上走 格,如果要越过 轴就贴着走,如图,那么选出的 个数就是红边也就是要越过的边的边数。
如果允许跨过 轴,那么最后我们会到达 ,红边边数就是最低点相反数。
所以我们需要对于每一个红色边数 ,找到使得最低点为 的方案数。
然后我们有一个引理
引理:从 走到 ,每次可以向右上/右/右下走,方案数分别为 。则路径方案数总数为 。
你用生成函数证明一下:
我们可以用这个公式和卡特兰数的折现容斥找到经过最低点大于等于 的方案数。
那么恰好为 的方案数就是:
然后统计答案,我们枚举这个 shaber 最低点 , 选择了 个, 选择了 个,设 ,而 。
然后你对后面的部分处理前缀和即可 计算一个 ,然后就做完了。
CF1076G Array Game
简单博弈论,随便写一下然后发现这个形如一个线性变换,线段树维护即可。
CF720D Slalom
维护每个点的最大权值,然后线段树维护即可。
CF1707D Partial Virtual Trees
二项式反演,我感觉这个题不是很简单啊,怎么之前我这么能贺代码的
对于集合反演,容斥掉真子集的条件,然后设计 表示 子树内直到 时刻还有点的方案数,转移简单。
如果设计为 生存在 时刻的方案数就不好转移了,还是要多考虑几种 dp 转移式子。
P8859 冒泡排序
首先是第一问,设计 表示插入了 的数,用了 次,写出转移不难发现就是第一类斯特林数。
然后第二问就很神秘了,首先我们考虑确定最大值位置,不妨放在最后,然后建出笛卡尔树,不难发现我们循环移位后,能减少的移动的最多次数,就是最多能向左走的次数。
然后就可以直接 dp 了,注意前缀和优化。
AT_abc348_g [ABC348G] Max (Sum - Max)
经典决策单调性。
AT_abc285_h [ABC285Ex] Avoid Square Number
二项式反演+生成函数简单题。
CF986F Oppa Funcan Style Remastered
对于 的质因数 的情况,扩欧即可。
时,最小的质因数 ,然后我们可以同余最短路即可。
AT_abc222_h [ABC222H] Beautiful Binary Tree
简单拉反题。
P5540 [BalkanOI2011] timeismoney | 最小乘积生成树
经 典 老 番
首先不难知道答案在凸包上,然后先找到 最小和 最小的点,对于这两个点连出来的线,我们考虑与这个叉积的最小值的边,求最小生成树即可。
复杂度
P5825 排列计数
CF1349F1 Slime and Sequences (Easy Version)
欧拉数是什么阴间,全忘了/zhq
P6700 [PA 2015 Final] Edycja
鸽了,有点困难。
CF1874E Jellyfish and Hack
写出 dp 式子,归纳证明是多项式,插值即可。
CF1948G MST with Matching
最大匹配等价于最小点覆盖,枚举哪些点,然后跑最小生成树即可。
CF724E Goods transportation
最小割模拟最大流,考虑 dp,要么割掉和 一个集合的点的边,要么割了和 的边。
CF1209G2 Into Blocks (hard version)
我们把每个颜色的区间找出来 ,对于所有的 ,则我们每次一定把若干个 为断点的区间划分出来。
然后我们发现每个区间一定变成出现次数最多的一个,然后这个可以直接维护最小值以及一些值维护。
P6570 [NOI Online #3 提高组] 优秀子序列
集合幂计数 exp 板子。
md 好多数论,先鸽了。
P6667 [清华集训2016] 如何优雅地求和
忘了怎么 Binomial-Sum 了。
P8329 [ZJOI2022] 树
P4707 重返现世
AT_agc038_e [AGC038E] Gachapon
P5643 [PKUWC2018] 随机游走
2024.05
P3600 随机数生成器
AT_agc023_f [AGC023F] 01 on Tree
CF1067E Random Forest Rank
P5326 [ZJOI2019] 开关
P6846 [CEOI2019] Amusement Park
AT_agc034_f [AGC034F] RNG and XOR
CF1916H2 Matrix Rank (Hard Version)
AT_abc216_h [ABC216H] Random Robots
P9041 [PA2021] Fiolki 2
P5296 [北京省选集训2019] 生成树计数
P3266 [JLOI2015] 骗我呢
P3959 [NOIP2017 提高组] 宝藏
CF840B Leha and another game about graph
AT_arc081_c [ARC081E] Don't Be a Subsequence
P6669 [清华集训2016] 组合数问题
不想推式子了,扔了
CF1175G Yet Another Partiton Problem
单调栈+可撤销李超线段树即可。
CF494C Helping People
似乎是建出一个树形结构,然后 表示树形结构上 中最大值为 的方案数。
AT_agc060_c [AGC060C] Large Heap
CF1096E The Top Scorer
AT_arc150_d [ARC150D] Removing Gacha
AT_abc306_h [ABC306Ex] Balance Scale
DAG 容斥板子,一个集合 的容斥系数是 ,但是这个题有相同的数,所以是 , 是 的连通块个数。
P6302 [NOI2019] 回家路线 加强版
每个点先找到作为哪些边的一部分,然后写出 dp 式子发现可以斜率优化,然后就做完了。
AT_arc176_d [ARC176D] Swap Permutation
枚举两个位置 ,然后矩阵快速幂计算最后为 的方案数。
然后知道之后剩下的就很好计算了。
P1912 [NOI2009] 诗人小G
决策单调性板子。
P8864 「KDOI-03」序列变换
先差分,然后问题变成把 分成 段,然后考虑暴力 dp,然后决策单调性,然后矩阵快速幂,复杂度 。
AT_arc173_d [ARC173D] Bracket Walk
我们把括号看成 ,然后我们考虑有一个经典结论:
( 和 ) 数量相等的括号序列必然存在循环移位使得该循环移位为合法括号序列,反之亦然。
所以我们只需要找到一个经过所有边的 环即可。
然后推一下就知道需要图中负环和正环的存在性相同才行。
AT_arc171_d [ARC171D] Rolling Hash
画一画就发现是一个状压 dp
AT_arc167_c [ARC167C] MST on Line++
绒绒,不想写了
AT_agc005_d [AGC005D] ~K Perm Counting
简单容斥题。
P10360 [PA2024] Desant 3
首先我们记录一下每个位置是 0/1/2 表示没准备好/准备好了/没有确定。
然后对于 只要有一个不是 的情况下,就可以直接递归了。
如果都是 的情况,非常棘手,会用减少两个数的代价递归 次,但是我们发现,由于对于 取模,所以 等价于 ,然后就只用递归两侧,复杂度 。
P10365 [PA2024] Kraniki
首先是由于期望的线性性,转化成计算每个线段能被多少个线段到达。
然后我们先找到一个全部挡住的线段,然后我们考虑计算这段区间中有多少线段即可,这个计算可以拆成若干段后倍增维护。
这个题挺好的,但是挺难的。
P10221 [省选联考 2024] 重塑时光
DAG 容斥板子,DAG 容斥完是一个卷积形式,直接做是 ,发现是一个 次多项式,算出 个点值插值即可,。
P5469 [NOI2019] 机器人
我们首先搜一手,发现合法的区间只有 个左右,然后直接 dp 是 的,似乎只有 ,不大行。
我们将值域段离散化一下,不难发现对于每个段都是一个 次多项式,插值即可,复杂度 ,似乎有点卡常。
AT_arc168_c [ARC168C] Swap Characters
CF1464F My Beautiful Madness
首先一个很直觉的贪心是,考虑 lca 最深的路径,我们只考虑他的 d 级祖先是否在所有路径的 d 邻居里,正确性比较显然,因为往下不会有比这条路径更加深的,而也不能更加往上了,现在的问题变成了判断一个点是否在所有路径的 d 邻居内,设这个点为 。
然后这个判断分成两部分,考虑 x 的 d 级祖先 y,如果一条路径 lca 不在 y 中,则一定经过 y,lca 在 y 中的,lca 到 x 的距离必须 ,证明比较显然,然后就可以做到 了。
CF1874F Jellyfish and OEIS
CF1687E Become Big For Me
CF1920F2 Smooth Sailing (Hard Version)
首先我们考虑射线法,然后建出虚点,跑 Kruskal 重构树即可,为了好写,我写的启发式合并。
P7606 [THUPC2021] 混乱邪恶
随机数据下 的前缀和是 级别的。
CF1194E Count The Rectangles
CF1806F2 GCD Master (hard version)
P3978 [TJOI2015] 概率论
看不懂找规律,考虑拉反,先期望转计数:
设 为有 个节点, 个叶子的方案数,因此我们得到:
然后你将 看成常数,对 拉反:
由于 会对答案有 的贡献,我们考虑答案就是
然后对于还要除以二叉树数量,可以直接背卡特兰数,也可以发现就是:
然后答案就是:
CF53E Dead Ends
简单状压 dp
P4831 Scarlet loves WenHuaKe
P10144 [WC2024] 水镜
首先随便列个 dp 方程,发现是 矩乘,这个是半群信息,可以线段树维护,但是我们可以上 baka's trick 做到线性。
CF868E Policeman and a Tree
AT_abc355_g [ABC355G] Baseball
wqs 二分+决策单调性,场切了,舒服。
P8511 [Ynoi Easy Round 2021] TEST_68
寻找全局最大值,取不到最大值的就是这两个点到根的链上的点,暴力处理一下即可。
比较好写的写法是将这两个点其中一个作为根即可。
AT_arc105_f [ARC105F] Lights Out on Connected Graph
简单状压 dp。
AT_abc340_g [ABC340G] Leaf Color
建虚树,dp 板子。
P2371 [国家集训队] 墨墨的等式
同余最短路,记得写转圈。
CF1286E Fedya the Potter Strikes Back
CF1721E Prefix Function Queries
P6080 [USACO05DEC] Cow Patterns G
CF86C Genetic engineering
AT_arc108_f [ARC108F] Paint Tree
P9035 「KDOI-04」Pont des souvenirs
CF1483F Exam
AT_arc104_c [ARC104C] Fair Elevator
AT_arc104_f [ARC104F] Visibility Sequence
AT_arc104_e [ARC104E] Random LIS
枚举相对大小,然后上一个 CF1295F,复杂度大概是 ,但是前面的枚举跑不满。
AT_arc106_f [ARC106F] Figures
也是一个经典老番。
首先考虑每个点的度数,设为 。
则由于 prufer 序列,我们可以知道答案是:
写出每个点的生成函数:
设 ,然后答案是:
AT_arc106_e [ARC106E] Medals
首先不难得到答案是 级别的,考虑二分一手,然后直接 Hall 定理即可。
Hall 定理部分的判断直接状压即可。
复杂度 。
AT_arc105_e [ARC105E] Keep Graph Disconnected
P3746 [六省联考 2017] 组合数问题
计算:
循环卷积即可。
AT_arc107_f [ARC107F] Sum of Abs
AT_arc108_e [ARC108E] Random IS
很邪恶的一点是概率和选择的先后顺序有关,所以我们需要寻找一个合理的 dp 顺序。
然后我们考虑,如果我们选择了 ,则此时选中其中每个的概率是与外面无关的,此时就是独立的子问题了,所以我们区间 dp 即可。
需要树状数组优化, 。
2024.06
P8424 [JOI Open 2022] 跷跷板(Seesaw)
一个神秘的原因是这个形如 时, 是一个定值且单调,则我们分治寻找这些段即可,段数似乎并不是很多。
CF505E Mr. Kitayuta vs. Bamboos
CF516D Drazil and Morning Exercise
找到直径中点作为根,然后我们考虑对于每个作为答案的连通块,在深度最小的点统计答案,则每次我们是一段链加,dfs+差分即可。
CF1580D Subsequence
建出笛卡尔树,简单 dp 即可。
P8425 [JOI Open 2022] 长颈鹿(Giraffes)
P2597 [ZJOI2012] 灾难
CF757F Team Rocket Rises Again
P7520 [省选联考 2021 A 卷] 支配
CF1830C Hyperregular Bracket Strings
P4152 [WC2014] 时空穿梭
基础数论题。
AT_arc112_e [ARC112E] Cigar Box
考虑有多少放在前缀,多少在后缀,剩下的是随便放的,然后直接计数即可,简单的。
AT_arc162_e [ARC162E] Strange Constraints
CF1466H Finding satisfactory solutions
CF685E Travelling Through the Snow Queen's Kingdom
去年联考题,很简单,直接考虑类似图函数那个题的做法即可。
CF920E Connected Components?
补图上 dfs,复杂度 。
P3488 [POI2009] LYZ-Ice Skates
简单 Hall 定理题。
P9000 [CEOI2022] Measures
拆拆式子即可。
CF1637G Birthday
CF1672I PermutationForces
不错的题,我个人感觉难度应该不止 *3000,怎么想都有 *3300
首先是有一个贪心,每次选 最小的,不会证明。
AT_abc267_h [ABC267Ex] Odd Sum
简单生成函数题。
CF1608F MEX counting
很好的 dp 题。
CF1193A Amusement Park
集合幂计数求逆板子。
P4728 [HNOI2009] 双递增序列
P1410 子序列
AT_arc142_e [ARC142E] Pairing Wizards
网络流,对于值域建图,后面的部分咕咕咕了。
AT_arc159_f [ARC159F] Good Division
首先不难知道可以删空的序列一定满足不存在绝对众数且长度为偶数。
首先一个好写的写法是让序列长度变成 ,每个位置存储 个数即可,这样不用考虑第二个条件。
然后我们考虑如何求解这个问题,我们考虑 表示以 为结尾的划分的方案数,然后考虑先分治下去,解决 问题,然后贡献到 。
首先我们可以加上每一个,再减去存在绝对众数的区间,首先如果是绝对众数,则必须在 后缀种是或者 前缀中是,而这样的数只有 个,找出来计算即可。
复杂度 ,但是跑得飞快。
AT_agc057_d [AGC057D] Sum Avoidance
鸽了
CF724F Uniformly Branched Trees
dp,为了不算重,考虑以中心为根即可。
CF1844G Tree Weights
我们每次按二进制位确定,则我们就可以排除 的影响了。
P10548 [THUPC 2024 决赛] 朔望
P10547 [THUPC 2024 决赛] 排列游戏
P10540 [THUPC 2024 决赛] 古明地枣的袜子
鸽了。
CF1375H Set Merging
分块后分治即可。
P6984 [NEERC2015] Landscape Improved
简单题。
CF1083D The Fair Nut's getting crazy
枚举交的区间,后面是扫描线基础。
CF1861F Four Suits
二分+网络流。
我们发现网络流左边只有 个点,然后枚举割掉的集合就可以代替最大流。
AT_code_festival_2017_quala_e Modern Painting
鸽了。
AT_arc080_c [ARC080E] Young Maids
每次线段树找一下最值即可。
CF1740F Conditional Mix
那个什么 Gale-Ryser 定理 题。
我们把每种权值 看成一个点,然后度数为出现次数,则我们的 S 就满足这个 Gale-Ryser 定理。
然后我们 dp 即可。
AT_arc101_d [ARC101F] Robots and Exits
每个点的 标在二维平面上,如果一条折线两端点集不同说明不同,然后 BIT 优化 dp 即可。
P5693 EI 的第六分块
KTT 板子。
CF436F Banners
简单 dp,KTT 优化。
AT_arc136_f [ARC136F] Flip Cells
逆天题,从原来学习笔记拉一个过来:
我们考虑令起始状态到第一次到终止状态的 PGF 为 F,终止到终止的为 H,起始到终止为 G,则我们知道:
然后我们需要计算 F'(1),即期望,初始有 b_i 个,最后有 a_i 个。
我们设 u=e^{z/hw},则我们知道:
我们可以预处理出来
然后就可以直接算。
P5326 [ZJOI2019] 开关
比上面一个像人类多了,还是从原来那里找的。
设 。
所以我们得到:
P6805 [CEOI2020] 春季大扫除
简单 ds
CF1830F The Third Grace
KTT 优化 dp
P5073 [Ynoi2015] 世上最幸福的女孩
KTT 直接冲
P5642 人造情感(emotion)
首先对于每个点算出子树内和字数外的最大值 ,然后计算就不困难了,然后 的计算有点点复杂,可以画一画。
CF671D Roads in Yusland
左偏树优化 dp
P9338 [JOISC 2023 Day3] Chorus
很复杂的题目,鸽了。
CF1279F New Year and Handle Change
wqs 二分,神秘。
CF1648D Serious Business
简单线段树优化 dp
CF1097G Vladislav and a Great Legend
斯特林数随便拆一下,然后得到一个组合数,直接 dp 即可。
CF1146H Satanic Panic
按斜率排序,然后 表示到 选了 个点的方案数。
CF1178G The Awesomest Vertex
KTT 题目。
P2046 [NOI2010] 海拔
网络流转对偶图最短路。
P7670 [JOI2018] Snake Escaping
首先找到 做法,然后拼起来。
CF1187F Expected Square Beauty
拆一拆期望即可。
CF780G Andryusha and Nervous Barriers
简单题。
AT_agc036_d [AGC036D] Negative Cycle
困难,鸽了。
P9339 [JOISC 2023 Day3] Cookies
还是 Gale-Ryser 定理。
然后由于我们不需要计算方案数,bitset 优化 dp 即可。
CF601D Acyclic Organic Compounds
不难知道种类数就是 Trie 中的节点数,然后启发式合并一下即可。
P10614 BZOJ3864 Hero meet devil
dp 套 dp 板子题,把本身 dp 的一维状压作为状态即可。
2024.07
CF1867F Most Different Tree
暴搜题。
CF1326F2 Wise Men (Hard Version)
首先来一下子集反演,然后我们变成计算钦定了若干位置为 后计数。
不难发现我们只关注 连续段长度集合,所以这里本质不同状态数只有 种。
然后先 dp 每个集合 连出多少条链,然后我们发现枚举了状态后面的部分就是一个形如 exp 的东西,但是我们本身集合大小和只有 ,所以我们只需要关注 or 为全集即可,所以直接预处理 FWT 即可。
然后计算贡献时,我们只需要得到 的权值,所以我们只算一项的复杂度是 的,复杂度 。
CF1906K Deck-Building Game
黎明前的巧克力,比较板子。
P9996 [Ynoi2000] hpi
随机数据半平面数点板子。
CF1340F Nastya and CBS
单侧递归,随便推一下就好了。
CF414E Mashmokh's Designed Problem
平衡树维护欧拉序。
P6781 [Ynoi2008] rupq
平衡树,单侧递归。
WBLT 多一倍点数没过/jy FHQ 过了,但是三者合并巨大一坨。
CF1919F2 Wine Factory (Hard Version)
鸽了。
CF1458F Range Diameter Sum
树上圆理论,分治之后会变成三段,一段为 C1,一段是 C1 C2 的并,一段只剩下了 C2 ,可以双指针维护。
P5773 [JSOI2016] 轻重路径
一个重儿子会变成轻儿子当且仅当 ,然后我们令 ,所以这样的点只有 个,之后的处理比较简单。
代价比较细节。
CF960H Santa's Gift
唐题。
P6684 [BalticOI 2020 Day1] 小丑
不难发现有单调性,整体二分即可。
CF1129D Isolation
shaber 分块题。
P8339 [AHOI2022] 钥匙
首先对于每种颜色建立虚树,然后以每个钥匙为根 dfs,遇到钥匙 ,遇到宝箱 ,如果为 就加入一个 的二元组。
显然如果路径 包含了 说明存在贡献,直接把路径放在二维平面上即可。
P9069 [Ynoi Easy Round 2022] 堕天作战 TEST_98
倍增分块板子。
CF1119H Triple
鸽了,但是可以拉一个原来的题解:
太厉害了。
首先我们考虑将三元组推广到一般情况:
给定 以及 ,令集合幂级数 ,然后求 的异或卷积 。
我们令 ,则我们知道 ,这里的乘法表示对应位置相乘,然后我们考虑 ,由于 FWT 定义我们知道其为 ,如果我们能得到 的每一位,就能 IFWT 得到 。
以下假设我们在求解 。
我们考虑将 的系数看成一个 位二进制数,如果第 位为 ,表示这一位的系数为 ,设 为对应组合分别的出现次数,那么我们如果能知道每一个 ,我们就可以 的时间复杂度内计算出 。
求解这些未知数 我们需要 个线性无关方程,一个人类智慧的事情是我们可以对于每一个 将 代入集合幂级数,我们考虑集合幂级数 。
然后我们考虑对于一个 , 对 对于 的贡献,首先由于 FWT 的线性性,所以我们得到 。
然后由于 ,所以我们知道 。
因为对于 ,仅有 的第 位为 且 的时候,才有 的贡献,所以 。
然后我们发现这个就是 做了 FWT 的 的值,所以我们只需要对于每个 做 FWT,然后在提出 项各处的值,拉出来 IFWT,就能得到 中每一个 的值,然后就可以做了。
时间复杂度 。
P4740 [CERC2017] Embedding Enumeration
复杂树形 dp,分讨很多,鸽了。
P8529 [Ynoi2003] 赫露艾斯塔
半平面莫队板子。
P1819 公共子序列
子序列自动机板子。
CF1383E Strange Operation
感觉,这个题,很困难啊,upd:真难吗?
判定是容易得到的:
设相邻两个 之间的 个数序列为 ,注意需要加上第一个 前面和最后一个 后面的部分。
然后每次可以让 序列某个 的数减去 或者删去一个不在开头和结尾的 。
然后我们可以忽略开头结尾,最后乘上 即可。
后面我们发现这个匹配过程可以 dp,有点细节,但是不难。
CF1799G Count Voting
简单容斥题。
P10591 BZOJ4671 异或图
我们考虑斯特林反演,设 表示钦定 个连通块的方案数, 为恰好 个的方案数,则我们知道:
然后我们考虑如何计算 ,我们考虑枚举每个点会被分到那个连通块,不同连通块之间不能连边,但是我们没有保证同一连通块之间一定有边,所以这是钦定,然后我们发现枚举完之后如何计算方案数,就是形如一个类似于一些边的状态异或为 ,可以线性基解决,然后枚举的总方案数是 的,可以接受。
P3598 Koishi Loves Number Theory
首先需要知道,多个数的 lcm 就是所有大小为奇数的子集的 gcd 之积除以大小为偶数的子集的 gcd 之积。
证明可以考虑指数上进行 min-max 容斥。
还需要知道 。
然后我们枚举 gcd=x 时,需要知道其大小为奇数的子集减去大小为偶数的子集的数量。
我们考虑计算 的倍数时的答案,然后莫比乌斯反演一下即可。
如何计算都是 的倍数的答案?设有 cnt 个数,,然后莫反即可。
P7360 「JZOI-1」红包
考虑 min-max 容斥,我们发现:
我们设
然后我们考虑代入原答案,枚举 大小:
然后可以整除分块做到 。
P8969 幻梦 | Dream with Dynamic
鸽了。
AT_arc168_e [ARC168E] Subsegments with Large Sums
鸽了。
CF1615F LEGOndary Grandmaster
首先我们把偶数位置上的取反,这样我们的操作变成了交换相邻两者。
很妙的一点是我们不用考虑原本相邻两者不同导致不能操作的情况,因为现在两者相同,你操作也没有用。
然后交换的代价我们其实可以拆成每个间隔,会计算 的代价。
我们可以 dp 计算每个前缀权值和为 和每个后缀和权值为 的方案数,然后求和即可。
CF1870G MEXanization
我们发现除了 之外答案单调,然后我们可以对询问不断判断能否增大,由于均摊,我们只需要判断 次。
考虑设最后的 为 ,则大于等于 的数都可以当成 看待。
然后我们从大到小考虑,维护一个 表示接下来的数还需要多少个,初始为 ,只是对于 为 ,可以特判,假设现在我们判断到了 , 个数为 。
- 假设 ,那么 都要多出 个,所以我们需要多出 个数,由于 ,所以这种情况只会发生 次,然后我们让 。
- 否则我们发现多出来的 只能当作 ,。
最后比较 和 的个数即可。
P8990 [北大集训 2021] 小明的树
首先我们知道什么时候是美丽的:
我们的没有点亮的灯集合是一个以 为根的连通块。
然后我们考虑此时如何计算点亮的连通块数量。
由于这是一个森林,所以我们可以直接点数-边数计算连通块数量。
设 表示 时刻未点亮的连通块数量,则 。
如果 我们再统计答案。
然后是点亮的连通块,我们发现点亮的连通块数量也可以用两端颜色不同的边数描述,然后我们直接线段树维护这个即可。
CF915G Coprime Arrays
首先随便莫反,然后发现我们实际上本质不同的贡献只有 个区间,差分即可。
CF1656H Equal LCM Subsets
首先我们考虑 中一个数 什么时候要删除:
然后我们可以开 棵线段树维护 和每个 的 ,以及 和每个 的 ,这样删除一个数的时候就很快速。
CF1651F Tower Defense
颜色段均摊题目,要么一个单点上次没有杀完,不然全部重新增长的时间都是相同的,然后判断是否会死在这个段内,如果会死就二分出位置,否则删掉这个段即可。
P9655 『GROI-R2』 Beside You
首先对于每个没消空的子树计算答案,然后简单 dp 一下即可。
CF1452G Game On Tree
简单题,自行思考一下即可。
P3587 [POI2015] POD
对于每种珠子随机赋值,满足其 xor 和为 ,然后一段 xor 和为 说明满足条件。
P4766 [CERC2014] Outer space invaders
对于时间区间 dp,考虑设 表示时间在 内的敌人被消灭的最小代价。
那么我们枚举一个时间 使用攻击,然后递归下去。
P3592 [POI2015] MYJ
我们把最小值考虑进入 dp 方程中。
设 表示考虑区间属于 的顾客,最小值为 时的综合。
然后 dp 转移可能需要一个后缀 max。
P3607 [USACO17JAN] Subsequence Reversal P
因为子序列翻转,我们可以拆成若干次交换两个数,但是我们发现值域的限制是不变的。
所以我们考虑设 为保留 ,值域目前是 的最多个数,然后转移简单。
AT_abc221_g [ABC221G] Jumping sequence
考虑旋转一下坐标系,不难知道后面横纵坐标独立,然后我们 bitset 优化即可。
AT_abc240_g [ABC240G] Teleporting Takahashi
P10041 [CCPC 2023 北京市赛] 史莱姆工厂
AT_arc096_d [ARC096F] Sweet Alchemy
CF1798F Gifts from Grandfather Ahmed
P2704 [NOI2001] 炮兵阵地
AT_arc096_c [ARC096E] Everything on It
AT_agc020_e [AGC020E] Encoding Subsets
P2473 [SCOI2008] 奖励关
P4173 残缺的字符串
P3803 【模板】多项式乘法(FFT)
CF755G PolandBall and Many Other Balls
CF103E Buying Sets
CF1781F Bracket Insertion
CF888F Connecting Vertices
CF1149D Abandoning Roads
CF1146G Zoning Restrictions
AT_agc012_e [AGC012E] Camel and Oases
CF1804H Code Lock
CF848D Shake It!
P9481 [NOI2023] 贸易
P4323 [JSOI2016] 独特的树叶
P10084 [GDKOI2024 提高组] 计算
AT_arc099_d [ARC099F] Eating Symbols Hard
AT_agc018_d [AGC018D] Tree and Hamilton Path
AT_arc143_e [ARC143E] Reversi
AT_arc093_d [ARC093F] Dark Horse
CF903G Yet Another Maxflow Problem
P3679 [CERC2016] 二分毯 Bipartite Blanket
P4364 [九省联考 2018] IIIDX
P3343 [ZJOI2015] 地震后的幻想乡
CF1842H Tenzing and Random Real Numbers
AT_agc020_f [AGC020F] Arcs on a Circle
AT_arc100_d [ARC100F] Colorful Sequences
AT_abc214_g [ABC214G] Three Permutations
AT_agc005_f [AGC005F] Many Easy Problems
CF1679E Typical Party in Dorm
AT_arc087_d [ARC087F] Squirrel Migration
AT_abc260_h [ABC260Ex] Colorfulness
AT_arc134_f [ARC134F] Flipping Coins
AT_agc058_d [AGC058D] Yet Another ABC String
P8292 [省选联考 2022] 卡牌
P2757 [国家集训队] 等差子序列
P2757 [国家集训队] 等差子序列
CF452F Permutation
AT_arc080_d [ARC080F] Prime Flip
AT_arc079_d [ARC079F] Namori Grundy
P3805 【模板】manacher
P3501 [POI2010] ANT-Antisymmetry
P4555 [国家集训队] 最长双回文串
P1659 [国家集训队] 拉拉队排练
P5446 [THUPC2018] 绿绿和串串
P3809 【模板】后缀排序
CF1728G Illumination
CF1726E Almost Perfect
AT_arc147_e [ARC147E] Examination
CF1109D Sasha and Interesting Fact from Graph Theory
P7323 [WC2021] 括号路径
P4128 [SHOI2006] 有色图
P4727 [HNOI2009] 图的同构计数
P7565 [JOISC 2021 Day3] ビーバーの会合 2
AT_joisc2016_h 回転寿司
CF1842G Tenzing and Random Operations
CF1019C Sergey's problem
CF1437F Emotional Fishermen
P3226 [HNOI2012] 集合选数
P3865 【模板】ST 表 && RMQ 问题
P3793 由乃救爷爷
CF1439D INOI Final Contests
CF1784D Wooden Spoon
AT_abc275_h [ABC275Ex] Monster
P3262 [JLOI2015] 战争调度
P6453 [COCI2008-2009#4] PERIODNI
P3757 [CQOI2017] 老C的键盘
P4099 [HEOI2013] SAO
P10210 [CTS2024] 水镜
CF1327F AND Segments
P10600 BZOJ4350 括号序列再战猪猪侠
CF1584F Strange LCS
P6116 [JOI 2019 Final] たのしいたのしいたのしい家庭菜園
CF1542E2 Abnormal Permutation Pairs (hard version)
P7831 [CCO2021] Travelling Merchant
P4649 [IOI2007] training 训练路径
CF1379F1 Chess Strikes Back (easy version)
P5912 [POI2004] JAS
AT_agc009_d [AGC009D] Uninity
CF1119F Niyaz and Small Degrees
P7600 [APIO2021] 封闭道路
P3267 [JLOI2016/SHOI2016] 侦察守卫
CF1874D Jellyfish and Miku
AT_agc040_e [AGC040E] Prefix Suffix Addition
AT_abc262_g [ABC262G] LIS with Stack
AT_agc065_d [AGC065D] Not Intersect
CF321E Ciel and Gondolas
CF1481E Sorting Books
CF1209E2 Rotate Columns (hard version)
P5999 [CEOI2016] kangaroo
P7967 [COCI2021-2022#2] Magneti
P9197 [JOI Open 2016] 摩天大楼
P1000 超级玛丽游戏
CF1515E Phoenix and Computers
CF704B Ant Man
AT_arc121_f [ARC121F] Logical Operations on Tree
CF1988D The Omnipotent Monster Killer
CF1153F Serval and Bonus Problem
CF1497E2 Square-free division (hard version)
CF1889C2 Doremy's Drying Plan (Hard Version)
P4220 [WC2018] 通道
P6192 【模板】最小斯坦纳树
P9074 [WC/CTS2023] 比赛
CF1408G Clusterization Counting
CF1823F Random Walk
P8189 [USACO22FEB] Redistributing Gifts G
CF1580B Mathematics Curriculum
CF1628D2 Game on Sum (Hard Version)
2024.08
CF627D Preorder Test
P10813 【MX-S2-T4】换
CF1059E Split the Tree
CF1120D Power Tree
CF1845E Boxes and Balls
CF1556F Sports Betting
CF771D Bear and Company
CF1398F Controversial Rounds
CF1146F Leaf Partition
AT_arc072_d [ARC072F] Dam
AT_arc070_c [ARC070E] NarrowRectangles
P8499 [NOI2022] 挑战 NPC Ⅱ
AT_agc044_c [AGC044C] Strange Dance
AT_arc092_d [ARC092F] Two Faced Edges
AT_arc153_d [ARC153D] Sum of Sum of Digits
P7916 [CSP-S 2021] 交通规划
AT_agc056_e [AGC056E] Cheese
P9047 [PA2021] Poborcy podatkowi
P9871 [NOIP2023] 天天爱打卡
P5896 [IOI2016] aliens
P9192 [USACO23OPEN] Pareidolia P
P9167 [省选联考 2023] 城市建造
P6276 [USACO20OPEN] Exercise P
AT_agc061_c [AGC061C] First Come First Serve
P6790 [SNOI2020] 生成树
P4426 [HNOI/AHOI2018] 毒瘤
P4581 [BJOI2014] 想法
AT_agc064_d [AGC064D] Red and Blue Chips
P5279 [ZJOI2019] 麻将
AT_abc367_g [ABC367G] Sum of (XOR^K or 0)
P5279 [ZJOI2019] 麻将
AT_keyence2019_e Connecting Cities
P2474 [SCOI2008] 天平
AT_agc056_c [AGC056C] 01 Balanced
P6621 [省选联考 2020 A 卷] 魔法商店
P3366 【模板】最小生成树
P10785 [NOI2024] 集合
P10787 [NOI2024] 树的定向
P10786 [NOI2024] 百万富翁
P10789 [NOI2024] 登山
P10787 [NOI2024] 树的定向
P10790 [NOI2024] 树形图
P9701 [GDCPC2023] Classic Problem
P3372 【模板】线段树 1
P4423 [BJWC2011] 最小三角形
P10217 [省选联考 2024] 季风
P10590 磁力块
P5599 【XR-4】文本编辑器
P8451 [LSOT-1] Crosspain
2024.09
P5188 [COCI2009-2010#4] PALACINKE
P3788 幽幽子吃西瓜
P5830 [ZJOI2016] 随机树生成器
AT_abc351_g [ABC351G] Hash on Tree
P9108 [PA2020] Malowanie płotu
P9882 [EC Final 2021] Vision Test
P8058 [BalkanOI2003] Farey 序列
AT_arc073_d [ARC073F] Many Moves
P9131 [USACO23FEB] Problem Setting P
P4782 【模板】2-SAT
P9990 [Ynoi Easy Round 2023] TEST_90
P2179 [NOI2012] 骑行川藏
P6189 [NOI Online #1 入门组] 跑步
AT_arc165_f [ARC165F] Make Adjacent
P4916 [MtOI2018] 魔力环
AT_agc030_d [AGC030D] Inversion Sum
P6326 Shopping
AT_arc111_f [ARC111F] Do you like query problems?
AT_arc114_d [ARC114D] Moving Pieces on Line
AT_arc114_f [ARC114F] Permutation Division
AT_arc115_e [ARC115E] LEQ and NEQ
P7230 [COCI2015-2016#3] NEKAMELEONI
P1813 拯救小 tim
AT_agc028_b [AGC028B] Removing Blocks
P7230 [COCI2015-2016#3] NEKAMELEONI
AT_arc117_d [ARC117D] Miracle Tree
P6684 [BalticOI 2020 Day1] 小丑
AT_mujin_pc_2017_c Robot and String
AT_arc124_d [ARC124D] Yet Another Sorting Problem
P7230 [COCI2015-2016#3] NEKAMELEONI
本文作者:Nityacke
本文链接:https://www.cnblogs.com/Nityacke/p/18407011
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步