题目链接 https://www.luogu.org/problemnew/show/P3950 分析 大佬都用LCT,我太弱只会树链剖分 一个很裸的维护边权树链剖分题.按照套路,对于一条边\(<u,v>(dep(u)<dep(v))\),让它边权加1就在\(v\)点处+1,将边的问题转化为点的问题 然后对于C,U操作,线段树单点修改,Q操作区间查询 注意 询问\(u,v(dep(u)>dep(v))\)点之间是否联通区间查询时注意是查询\([u,son[v]]\)的和,忽然发现N…
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例1 输出样例1 输入样例2 输出样例2 输入样例3 输出样例3 说明 思路 AC代码 总结 题面 题目链接 P3950 部落冲突 题目描述 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事. 其中,在大大小小的部落之间,会有一些道路相连,这些道路是Tr…
Luogu P2486 [SDOI2011]染色 题面 题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q 3 5 C 5 1 2 Q 3 5 输出样例: 3 1 2 说明: 思路 好久没打树剖了,今天和水星爹爹 \(solo\) 这道题的时候输掉了(你爹爹还是你爹爹) \(qwq\) . 进入正题.早在成都的时候 \(czk\) 巨佬就…
题解 不妨采取重链剖分的方式把路径剖成区间,然后用线段树维护,考虑如何合并一个区间 struct Node { int lf, rg, tot; }seg[N << 2]; int col[N << 2]; inline Node merge(const Node &lc, const Node &rc) { if(!lc.tot) return rc; if(!rc.tot) return lc; Node ret = (Node){lc.lf, rc.rg, l…
题目连接:https://www.luogu.org/problemnew/show/P3950 1.像我这种学数据结构学傻了的 2.边权化点权 所有点权初始化0 3.对于战争 将深度较深的-1,对于和平 将深度较深的+1 4.对于历史 用war记录 5.特别注意 在两个查询的LCA处判断是否为-1并且当前的整条路径上的点权也为-1时 同样是yes 代码: include include include include define lson left, mid, rt<<1 define r…
嘟嘟嘟 树剖板子题. #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdlib> #include<cctype> #include<stack> #include<queue> #include<vector> using name…
原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 我们用Link-Cut-Tree维护连通性(十分无脑) 一开始先把树中每条边的两端连接 U操作:把u,v两个点连起来 C操作:把u,v两个点分开来 Q操作:判断在这个森林里u的根和v的根是否相等(是否连通) #include <bits/stdc++.h> #define N 300005 #define getchar nc using namespace std; inline char nc(){ stat…
题目链接 luogu P3950 部落冲突 题解 树剖线段树可以 lct还行 代码 #include<cstdio> #include<algorithm> inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' || c > '9')c = getchar(); while(c <= '9' && c >= '0') x = x * 10 + c - '0…
题目链接:https://www.luogu.org/problem/P2590 树链剖分模板题. 剖分过程要用到如下7个值: fa[u]:u的父节点编号: dep[u]:u的深度: size[u]:u为根的子树中节点总数: son[u]:u的重儿子: top[u]:u所在的重链的顶部节点: seg[u]:u在线段树中的位置: rev[u]:seg的倒置,即rev[seg[u]] == u. 然后套线段树模板实现区间最值.区间和,及单点更新操作. 实现代码如下: #include <bits/s…
题目链接 状态奇差无比,sbt都能错一遍. 不动笔光想没有想到怎么做,画图之后发现一个很明显的性质…… 那就是两个开战的部落,其中一个是另一个的父亲. 所以在儿子那里加个权值.查询的时候树链剖分查询链上点权和,减去lca的点权(因为lca那如果有点权,代表的是lca和lca的父亲之间的那条边). #include<cstdio> #include<algorithm> #include<cctype> #include<cstring> #include&l…