CF 口胡笔记 2100Ct辑
只需要口胡CF题就行啦!(
从昨天起口胡 CF 按照洛谷通过人数排序的题单
这期我们来口胡 CF2100 Part 1 吧 ~
目录导航:
CF208E Blood Cousins
给定树上节点
和距离 ,求有多少 节点满足 与 的 级祖先相同。
可以点分树。更简单的做法是启发式合并。
题解还有线段树合并的做法的,感觉很有趣。
CF343D Water Tree
树。
次操作。操作有 种:
1. 将点和其子树上的所有节点的权值改为 。
2. 将点到 的路径上的所有节点的权值改为 。
3. 询问点的权值。
。
重链剖分+线段树板题
看看题解吧,什么,
题解给了一道前置题目,那我们就先做这道前置题目吧:
[P2936 USACO09JAN] Total Flow S [展开]
个节点,每个节点之间可能有多条水管。串联水管取流量最小的作为合并后的水管的流量。并联水管取流量之和为合并后的水管的流量。求 点到 点的流量。
不就是 Floyd
吗,为什么是蓝题。看题解吧。
哦,原来还可以是网络流啊(
不过看评论区好像是树上差分的原题被吞了,所以现在的前置题目和本题没有一点关系/愤怒
对于本题:
看了题解代码,我惊为天人!!!
题解开了两颗线段树, T1
记录该节点被改成 T2
记录该节点是
scanf("%d %d",&op,&x);
if(op == 1)t1[dfn[x]:dfn[x]+size[x]-1]+=i;
else if(op == 2)t2[dfn[x]]+=i;
对于查询,
else if(op == 3)printf("%d\n",t1[dfn[x]:dfn[x]]>t2[dfn[x]:dfn[x] + size[x] - 1]);
CF1187E Tree Painting
树。一个点被删除只能当这个点是第一个被删除或者有一个相邻的被删除点。删除时记录该点所在联通块大小
,找到一种删除点的顺序来最大化 。
好像是 dp ,但是不会。
看一下提示吧:
删除了第一个点后,剩下的就不影响权值了
噢噢噢噢好有意思,写一下代码吧
展开代码
#include<bits/stdc++.h>
using namespace std;
#define ff(i,l,r) for(auto i=(l);(i)<=(r);++i)
#define fi(l,r) ff(i,l,r)
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define ul unsigned ll
#define ui unsigned int
#define P 998244353
#define N 200005
#define M 400005
ll ans,f[N],g[N];
int siz[N],tot,fir[N],nxt[M],to[M],n;
void add(int x,int y){
nxt[++tot]=fir[x];
fir[x]=tot;
to[tot]=y;
}
void dfs1(int x,int fa){
siz[x]=1;
for(int e=fir[x];e;e=nxt[e]){
int u=to[e];
if(u==fa)continue;
dfs1(u,x);
siz[x]+=siz[u];
f[x]+=f[u];
f[x]+=siz[u];
}
}
void dfs2(int x,int fa){
ans=max(ans,f[x]+g[x]+n);
for(int e=fir[x];e;e=nxt[e]){
int u=to[e];
if(u==fa)continue;
g[u]=f[x]-f[u]-siz[u]+g[x]+n-siz[u];
dfs2(u,x);
}
}
int main(){
scanf("%d",&n);
fi(2,n){
int x,y;
scanf("%d %d",&x,&y);
add(x,y);
add(y,x);
}
dfs1(1,0);
dfs2(1,0);
printf("%lld\n",ans);
return 0;
}
一遍过,帅!
CF656D Rosetta Problem
题目描述是乱码,就不放了。
这道题太难了,根本不会做。看题解吧。
题解看完还是不懂,做不了一点/doge
CF620E New Year Tree
给出一棵
个节点的树,根节点为 。每个节点上有一种颜色 。 次操作。操作有两种:
1 u c
:将以为根的子树上的所有节点的颜色改为 。 2 u
:询问以为根的子树上的所有节点的颜色数量。
, 。
注意到颜色范围很小,开60个树状数组 (91MB
) 就行了。
看看题解吧。
oh,原来可以状压。我小丑了。
CF372C Watching Fireworks is Fun
一个城镇有
个区域,从左到右编号为 ,每个区域之间距离 个单位距离。 有
个烟火要放,给定放的地点 ,时间 ,如果你当时在区域 ,那么你可以获得 的开心值。 你每个单位时间可以移动不超过
个单位距离。 你的初始位置是任意的(初始时刻为
),求你通过移动能获取到的最大的开心值。
, , , 。
感觉是
可以用单调栈。
CF837D Round Subset
个数 中选 个让乘积的后缀 最多。
这是一个 minmax 问题,注意到
CF519E A and B and Lecture Rooms
树上询问两个点
,求到 距离相等的点的数量。 次询问。
设
否则记与
CF609E Minimum spanning tree for each edge
给定一个无向图,求出必须包括
号边时的最小生成树。 ;
简单题,略。
CF1207F Remainder Problem
给你一个长度为
的序列,初值为 ,你要完成 次操作,操作有如下两种:
1 x y
: 将下标为的位置的值加上 2 x y
: 询问所有下标模的结果为 的位置的值之和 操作数
根号分治:
对于大于
对于小于等于
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现