CF Graphs

CF746G New Roads

构造题。
显然优先满足强制叶子节点的限制,设第 i 层叶节点数 bi 。考虑到 ai>ai+1 则必有第 ibiaiai+1 个点强制为叶子节点,钦定叶子节点后 aiaibi,kkbi ,显然序列 a 为单调不降序列。
此时还需钦定 k 个叶节点,第 i 层仍有 ai 个节点状态待定,我们只需从 ai 个待定节点选取 k 个作为叶节点即可。
时间复杂度 O(n)
Code

CF59E Shortest Path

有限制的最短路。
给定有序三元组 a,b,c 限制不能连续经过,边权为 1 ,求最短路,n3000,m2e4,k1e5
看到 n3e3 ,回忆CSP-S2022 T1,搜索BFS即可。 disi,j 表示对于 i 点的上一个点为 j 的最短路长度,set 哈希维护不可经过的有序三元组。
Code

CF909E Coprocessor

DAG刷表题。
disi 表示当前点 i 需要 disi 次统一副机
对于每条由副机到主机的线路 S TdisTmax(disT,disS+1) (需要先启动主机再动副机,次数+1)。
对于每条其他线路, disTmax(disT,disS)
答案为副机dis最大值: ansmax(disi)ai=1
Code

CF467D Fedor and Essay

恶心Tarjan缩点+DAG+字符串预处理———杂糅题
首先将每一个小写相同的字符串视为一个点,记字符 r 个数为 ri ,长度为 li ,对于 x,y 反向建有向边,这样可以直接 xupdy 。注意到转换操作可能存在环,Tarjan缩点合并 li,ri 即可
Code

CF242D Dispute

贪心题,套图论的羊皮。
将有效点击分为主动和被动,注意到同时主动点击先后主动点击但单点只点一次等价。
curi 为当前两种点击总次数,visi 为是否曾主动点击。
优先队列维护当前 ai=curi 的点,每次弹出 ai 最小的点并更新(主动点击)即可,若 visi=1 则需更新 2 次而无解。
正确性:注意到优先保证 ai 较小的点消除了后效性,且原题只要求输出可行而非最优方案。
Code

CF229C Triangles

计数+思维题。定义“三角形”为图上长度为 3 的环。
整难则反,原图“三角形”数: tot=n(n1)(n2)/6 ,可以观察到初始删一条扣除贡献为 n2 。然后笔者感觉不好做了, O(n3) 容斥TLE
考虑稍稍转化题意:完全图 U 初始全为黑边,将 m 条边变为白边得到 U ,求图 U 纯色“三角形”个数(三边同色)。
U 中“三角形”形态存在 4 种,只需求出“21白”与“21黑”即可得到“纯色”。可以观察得到性质:三角形“杂色”当且仅当 2 个顶点连边“11白”。
ai为节点 i 的白边数,则节点 i 的“11白”对数为 ai(nai1) ,由性质有“杂色三角形”总数: ai(nai1)2 ,容斥答案: ans=totai(nai1)2
Code

CF912D Fishes

期望最大化题。BFS属于是凑数。
考虑每个单元格对全局期望的贡献,选择前 k 大单元格即可。
给出式子:
总渔网可能方案数: tot=(nr+1)(mr+1)
格子 (x,y) 贡献期望: vali=(min(x+r1,n)max(x,r)+1)(min(y+r1,m)max(y,r)+1)1.0
Code

CF875C National Property

2-SAT。
考虑相邻串 ABAi,Bi 不相等(字典序必须存在差异)。根据 Ai,Bi 大小得到 Ai,BiAi,Bi 的约束关系,2SAT/Tarjan 即可。
Code

CF666B World Tour

Meet in the Middle+最短路。
O(n2) 预处理正反全源最短路, f[u][02][0/1]/pt[u][02][0/1] 记录 u 源点的前 3 长路径长度与终点。
枚举中间节点 B,C ,根据前 3 优解:由 B 反向枚举 A ,由 C 正向枚举 D 。时间复杂度 O(N2)
本题与笔者第一道CCF赛时真题CSP-S2022 T1 假期计划非常相似———图论结构,利用Meet in the Middle降低时间复杂度,枚举较优解;唯一区别在于对边权或点权处理。
Code

CF840B Leha and another game about graph

奇偶特殊性题,连通图。
笔者第一次思考时,考虑将奇偶点尽可能化为无限制点,苦于1.贪心策略无法证明,2.全为奇偶点无法处理。
设白为 0 ,黑为 1
首先考虑连边对点的度数改变情况:翻转两点的奇偶。更进一步,边对点的改变可以表示为: u,vu 加上点 v 奇偶性,点 v 置为 0 ,理解:同色相连全置为 0 ,异色相连白置 1 黑置 0
有一个比较妙的性质:可以匹配当且仅当奇点个数为奇。很好理解:连边只有两端为黑才会 2 ,奇数奇点无法清零。
由性质可以用 1 满足“奇数奇点”化为“偶数奇点”,无法满足即无解。
然后任选一个根节点,生成任意原图生成树, dfs 遍历回溯时 异色连边根据子树连边改变自身节点度数 即可。
CF Official Editorial
Code

CF1037E Trips

倒推题。
处理出最终状态,由不满足要求的枝端节点开始删边,注意标记一条边只可被删一次就无效。
Code

CF936B Sleepy Game

记搜+判环题。
vis[i][0/1] 记录是否奇偶数步可达,最后Tarjan判环即可。
Code

CF920E Connected Components?

BruteForce!
先将每个点丢入set,按顺序取出点进行操作。
对于从set中取出的每个点 u ,我们要排出 u 所在连通分量的所有点。
queue循环找同一连通分量的点。遍历目前仍在set中的所有点,若无删边相连则说明在同一连通分量,将这一点放入queue;执行遍历直至更新出所有同一连通分量的点并从set中移除。
Why do you use set?---O(nlogn)
Code

    for(ll i = 1; i <= n ; i++) w.insert(i);
    while(w.size()){
	it = w.begin();
	ll x = *it; it = w.erase(it);
	++tot, cnt[tot]++;
		
	queue<ll> q;
	q.push(x);
	while(!q.empty()){
	    ll u = q.front(); q.pop();
	    for(it = w.begin(); it != w.end(); )
	    if(e[u].count(*it)) ++it;
	    else cnt[tot]++, q.push((*it)), it=w.erase(it);
	}
    }

CF33D Knights

隐式图、建图。
由于圆不相交,只需将大圆包含小圆看作树上父子节点即可。 LCA 路径长即为答案。
注意处理根节点为最外侧一个极大的虚拟圆,包含关系特判极大值即可。
Code

CF545E Paths and Trees

最短路,最小生成树。
给定源点,求最小权最短路径生成树。
显然对于每一个非源点,确定父边(父节点入边)即可确定树的形态。 SPFA时选择每个非源点的权值最小的最短路径入边 即为答案。
Code

CF1280C Jeremy Bearimy

贪心?
每个点必须匹配——— p2
对于点u的父边(向上连边):
最小值:最优为点对尽可能在子树内,最坏有子树奇数个点,贡献为 w
最大值:最优为点对尽可能跨过这条边,最坏有 min(sizu,nsizu) 个点对,贡献为 min(sizu,nsizu)w
Code

CF949C Data Center Maintenance

Tarjan缩点。
将“若 A 推迟,则 B 必须推迟”看作 AB 的一条有向边。
注意到有向图单一强连通分量必须同步改变,也可能使其他分量改变。因此缩点后得到DAG上出度为 0 的点 siz 最小者为答案。
Code

CF533B Work Group

树形DP。
f[i][0/1] 表示 u 子树内选奇数/偶数个点的最值。每个点初始化 f[u][0]=0,f[u][1]=inff[u][1]最初非法。
状态转移方程:

    f[u][0] = 0, f[u][1] = -inf;//f[u][1] is illegal at first
    for(auto v : e[u]){
        dfs(v);  ll x0 = f[u][0], x1 = f[u][1];
        f[u][0] = max(x0 + f[v][0], x1 + f[v][1]);
        f[u][1] = max(x1 + f[v][0], x0 + f[v][1]);
    }
    f[u][1] = max(f[u][1], f[u][0] + v[u]);

Code

CF609E Minimum spanning tree for each edge

最小生成树。
对于边 e 。若在最小生成树上,最小生成树权值即为答案。否则找到MST树上 u,v 两点路径上边权最大值替换即可———可以用倍增维护 LCAMaxval
Code

CF1067B Multihedgehog

BFS?DFS?
笔者最初考虑以树的重心作为根节点,然而WA,该猜想目前没有甚么证明。
考虑从每个叶子节点BFS,最后得到根节点。然后DFS判断每个节点的子节点出度是否 3 即可。
正确性:对于一个合法图, BFSdep/DFSdegree 得到结果一定正确。
Code

posted @   Yzfu  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示