洛谷3703 [SDOI2017] 树点染色 【LCT】【线段树】
题目分析:
操作一很明显等价于LCT上的access操作,操作二是常识,操作三转化到dfs序上求最大值也是常识。access的时候顺便在线段树中把对应部分-1,把右子树的子树+1即可。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; int num,n,m; vector <int> g[maxn]; int f[maxn],dep[maxn],dfsin[maxn],dfsout[maxn]; class SegmentTree{
private:
int data[maxn<<],lazy[maxn<<],maxx[maxn<<];
void push_down(int now){
int L = (now<<),R = (now<<|);
data[L] += lazy[now]; maxx[L] += lazy[now]; lazy[L] += lazy[now];
data[R] += lazy[now]; maxx[R] += lazy[now]; lazy[R] += lazy[now];
lazy[now] = ;
}
public:
void Add(int now,int tl,int tr,int l,int r,int d){
if(lazy[now]&&tl!=tr) push_down(now);
if(tl >= l && tr <= r){
data[now] += d; lazy[now] += d;maxx[now] += d; return;
}
if(tl > r || tr < l) return;
int mid = (tl+tr)/;
Add(now<<,tl,mid,l,r,d);
Add(now<<|,mid+,tr,l,r,d);
maxx[now] = max(maxx[now<<],maxx[now<<|]);
}
int Query(int now,int tl,int tr,int l,int r){
if(lazy[now]&&tl!=tr) push_down(now);
if(tl >= l && tr <= r) return maxx[now];
if(tl > r || tr < l) return ;
int mid = (tl+tr)/;
int ans = max(Query(now<<,tl,mid,l,r),Query(now<<|,mid+,tr,l,r));
maxx[now] = max(maxx[now<<],maxx[now<<|]);
return ans;
}
}T; class LinkCutTree{
private:
int ch[maxn][],fa[maxn],data[maxn];
stack <int> sta; int is_root(int now){return ch[fa[now]][]!=now&&ch[fa[now]][]!=now;} void r0(int now,int dr){
int son = ch[now][dr],pa = fa[now],gp = fa[pa];
int tag = is_root(pa);
ch[pa][dr^] = son; fa[son] = pa;
ch[now][dr] = pa; fa[pa] = now; fa[now] = gp;
if(tag == ) return;
if(ch[gp][] == pa) ch[gp][] = now;
else ch[gp][] = now;
} void splay(int now){
while(!is_root(now)){
int pa = fa[now],gp = fa[pa];
if(is_root(pa)){
if(ch[pa][] == now) r0(now,);
else r0(now,);
}else{
if(ch[gp][] == pa){
if(ch[pa][] == now) r0(pa,),r0(now,);
else r0(now,),r0(now,);
}else{
if(ch[pa][] == now) r0(now,),r0(now,);
else r0(pa,),r0(now,);
}
}
}
}
public:
void access(int now){
int p = now,last = ;
while(p != ){
splay(p);
int zz = ch[p][]; while(ch[zz][]) zz = ch[zz][];
if(zz)T.Add(,,n,dfsin[zz],dfsout[zz],);
int lt = p; while(ch[lt][]) lt = ch[lt][];
T.Add(,,n,dfsin[lt],dfsout[lt],-);
ch[p][] = last;
last = p; p = fa[p];
}
T.Add(,,n,,n,);
}
void BuildLCT(){
for(int i=;i<=n;i++) data[i] = dep[i];
for(int i=;i<=n;i++) fa[i] = f[i];
}
}LCT; void read(){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
int u,v; scanf("%d%d",&u,&v);
g[u].push_back(v); g[v].push_back(u);
}
} int RMQ[maxn<<][],app[maxn][],euler[maxn<<],nE; void dfs(int now,int fa,int dp){
f[now] = fa; dep[now] = dp;
euler[++nE] = now; app[now][] = app[now][] = nE;
dfsin[now] = dfsout[now] = ++num;
T.Add(,,n,dfsin[now],dfsin[now],dp);
for(int i=;i<g[now].size();i++){
int p = g[now][i];
if(p == fa) continue;
dfs(p,now,dp+);
dfsout[now] = dfsout[p];
euler[++nE] = now; app[now][] = nE;
}
} void BuildRMQ(){
for(int i=;i<=nE;i++) RMQ[i][] = euler[i];
for(int k=;(<<k)<=nE;k++){
for(int i=;i<=nE;i++){
if(i+(<<k-) > nE) {RMQ[i][k] = RMQ[i][k-];continue;}
if(dep[RMQ[i][k-]] < dep[RMQ[i+(<<k-)][k-]]){
RMQ[i][k] = RMQ[i][k-];
}else RMQ[i][k] = RMQ[i+(<<k-)][k-];
}
}
} int QueryLCA(int u,int v){
int fst = min(app[u][],app[v][]),sec = max(app[u][],app[v][]);
int len = sec-fst+,k = ;
while((<<k+) <= len) k++;
if(dep[RMQ[fst][k]] < dep[RMQ[sec-(<<k)+][k]]) return RMQ[fst][k];
else return RMQ[sec-(<<k)+][k];
} void init(){
dfs(,,);
BuildRMQ();
LCT.BuildLCT();
} void getdist(){
int u,v; scanf("%d%d",&u,&v);
int lca = QueryLCA(u,v);
u = dfsin[u],v = dfsin[v],lca = dfsin[lca];
int ans = T.Query(,,n,u,u)+T.Query(,,n,v,v);
ans = ans - *T.Query(,,n,lca,lca) + ;
printf("%d\n",ans);
} void Query(){
int u; scanf("%d",&u);
int ans = T.Query(,,n,dfsin[u],dfsout[u]);
printf("%d\n",ans);
} void work(){
for(int i=;i<=m;i++){
int cas; scanf("%d",&cas);
if(cas == ){int x;scanf("%d",&x);LCT.access(x);}
else if(cas == ) getdist();
else if(cas == ) Query();
}
} int main(){
read();
init();
work();
return ;
}
洛谷3703 [SDOI2017] 树点染色 【LCT】【线段树】的更多相关文章
- HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- POJ 2104 K-th Number && 洛谷 P3834 【模板】可持久化线段树 1(主席树)
我惊奇的发现这两道题一模一样 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询 ...
- 洛谷3703 SDOI2017树点涂色(LCT+线段树+dfs序)
又一道好题啊qwqqqq 一开始看这个题,还以为是一个树剖的什么毒瘤题目 (不过的确貌似可以用树剖啊) qwq这真是一道\(LCT\)维护颜色的好题 首先,我们来一个一个操作的考虑. 对于操作\(1\ ...
- 【SDOI2017】树点染色【线段树+LCT】
本来只是想练练LCT,没想到是个线段树 对于操作1:诶新的颜色?这不是access吗? 也就是说,我们用一棵splay来表示一种颜色 操作2直接在LCT上乱搞-- 不对啊,操作3要查子树 诶好像是静态 ...
- 【洛谷4219】[BJOI2014]大融合(线段树分治)
题目: 洛谷4219 分析: 很明显,查询的是删掉某条边后两端点所在连通块大小的乘积. 有加边和删边,想到LCT.但是我不会用LCT查连通块大小啊.果断弃了 有加边和删边,还跟连通性有关,于是开始yy ...
- 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- 【Foreign】染色 [LCT][线段树]
染色 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output Sample Input 13 0 1 0 2 1 11 1 ...
- 洛谷 P1083 借教室【二分+差分/线段树】
二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...
- 3.28 省选模拟赛 染色 LCT+线段树
发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...
随机推荐
- 用Flask+Redis维护代理池
GitHub:https://github.com/LXL-YAN/ProxyPool 视频讲解:https://www.bilibili.com/video/av19057145/?p=17
- Python_练习题_49
# 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao','nezha'] def func(item): re ...
- 01-JavaScript介绍
JavaScript价绍 1.引言 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) ...
- R语言线性回归
回归分析是一个广泛使用的统计工具,用于建立两个变量之间的关系模型. 这些变量之一称为预测变量,其值通过实验收集. 另一个变量称为响应变量,其值来自预测变量. 在线性回归中,这两个变量通过一个等式相关联 ...
- 运行Maven项目时出现invalid LOC header (bad signature)错误,Tomcat不能正常启动
作为Maven小白,今天这问题困扰了我好久,经过多次在网上查询,终于找到了原因.明明一个小问题却耗费很多时间,着实不应该,所以必须记录一下. 报错信息如下: 对话框: 控制台: <span st ...
- adb通过wifi连接android设备
问题背景 近期的项目测试中,需要将移动设备与厂商机器进行usb连接视频传输(投屏).测试过程中需要定位问题,经常需要查看实时日志,移动设备已经和厂商机器usb连接投屏,无法用usb连接到PC,那么有什 ...
- JEECG SSO kisso
kisso: java 基于 Cookie 的 SSO 中间件 kisso https://gitee.com/baomidou/kisso kisso首页.文档和下载 - 基于 Cookie 的 S ...
- MyBatis全局配置文件的各项标签3
mapper 将sql映射注册到全局配置中,这个我们在上一章已经使用过了, resource 这个属性是用来引用类路径下的sql映射文件 url 这个属性是用来引用网络路径或磁盘路径下的sql映射文件 ...
- Java 多线程概述
几乎所有的操作系统都支持同时运行多个任务,一 个任务通常就是一个程序,每个运行中的程序就是一个进程.当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 线程和进程 几乎所有的 ...
- Web移动端---iPhone X适配(底部栏黑横线)
一.相信大家有被iPhone X底部黑色横线支配的恐惧 上面我们可以看到,底部的导航栏被一条黑色横线所盖住,那么就很烦.下面我们可以开始进行适配环节 1.首先我们可以用 JS 判断手机环境是不是 iP ...