CF343D Water Tree 树链剖分
问题描述
题解
树剖,线段树维护0-1序列
yzhang:用珂朵莉树维护多好
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-'){fh=-1;ch=getchar(); }
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=500007;
const int maxm=1000007;
int n,T;
int Head[maxn],to[maxm],Next[maxm],tot;
void add(int x,int y){
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot;
}
int size[maxn],son[maxn];
int fa[maxn],dep[maxn],top[maxn],New[maxn],pre[maxn],ind;
void dfs1(int x,int f,int dp){
size[x]=1,fa[x]=f,dep[x]=dp;
int mx=-1;
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(y==f) continue;
dfs1(y,x,dp+1);size[x]+=size[y];
if(size[y]>mx) mx=size[y],son[x]=y;
}
}
int dfn[maxn];
void dfs2(int x,int tp){
top[x]=tp,New[x]=++ind,pre[ind]=x,dfn[x]=ind;
if(!son[x]) return;
dfs2(son[x],tp);
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(y==fa[x]||y==son[x]) continue;
dfs2(y,y);
}
dfn[x]=ind;
}
#define lfc (x<<1)
#define rgc ((x<<1)|1)
#define mid ((l+r)>>1)
int val[maxn<<2],lazy[maxn<<2];
int L,R,need;
void pushdown(int x){
lazy[lfc]=lazy[rgc]=lazy[x];val[lfc]=val[rgc]=lazy[x]-1;
lazy[x]=0;
}
void pushup(int x){
val[x]=val[lfc]+val[rgc];
}
void change(int x,int l,int r){
if(L>r||R<l) return;
if(L<=l&&r<=R){
lazy[x]=need+1,val[x]=need;return;
}
if(lazy[x]) pushdown(x);
change(lfc,l,mid);change(rgc,mid+1,r);
pushup(x);
}
int query(int x,int l,int r){
if(l==r) return val[x];
if(lazy[x]) pushdown(x);
int res;
if(L<=mid) res=query(lfc,l,mid);
else res=query(rgc,mid+1,r);
pushup(x);
return res;
}
void cz1(){
int x;read(x);
L=New[x],R=dfn[x],need=1;
change(1,1,n);
}
void cz2(){
int x,y=1;read(x);
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
L=New[top[x]],R=New[x],need=0;
change(1,1,n);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
L=New[x],R=New[y],need=0;
change(1,1,n);
}
void cz3(){
int x;read(x);
L=New[x];
printf("%d\n",query(1,1,n));
}
int main(){
read(n);
for(int i=1,x,y;i<n;i++){
read(x);read(y);
add(x,y);add(y,x);
}
dfs1(1,0,1);dfs2(1,1);
read(T);int op;
while(T--){
read(op);
if(op==1) cz1();
else if(op==2) cz2();
else cz3();
}
return 0;
}
CF343D Water Tree 树链剖分的更多相关文章
- Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序
Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...
- Codeforces Round #200 (Div. 1) D. Water Tree 树链剖分+线段树
D. Water Tree time limit per test 4 seconds memory limit per test 256 megabytes input standard input ...
- Water Tree(树链剖分+dfs时间戳)
Water Tree http://codeforces.com/problemset/problem/343/D time limit per test 4 seconds memory limit ...
- CodeForces 343D water tree(树链剖分)
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
- Hdu 5274 Dylans loves tree (树链剖分模板)
Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...
- POJ3237 Tree 树链剖分 边权
POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...
- Query on a tree——树链剖分整理
树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...
- 【BZOJ-4353】Play with tree 树链剖分
4353: Play with tree Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 31 Solved: 19[Submit][Status][ ...
- SPOJ Query on a tree 树链剖分 水题
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
随机推荐
- MYSQL的备份与恢复--物理备份xrabackup
目录 1.数据库完整备份与恢复 (1)环境准备 (2)完全备份恢复流程 2.数据库增量备份与恢复 (1)增量和差异概述 (2)增量备份和恢复 3.数据库差异备份与恢复 4.简单命令进行物理备份 5.实 ...
- 2个ajax的相互调用解决异步问题
- matlab练习程序(计算图像旋转角度)
比如有图像1,将其旋转n度得到图像2,问如何比较两张图像得到旋转的度数n. 算法思路参考logpolar变换: 1.从图像中心位置向四周引出射线. 2.计算每根射线所打到图像上的像素累计和,得到极坐标 ...
- Windows许可证 即将过期
最近打开电脑,系统总是自动弹出Windows许可证即将过期的弹窗,现在总结方法如下. 命令都是在运行窗口输入的打开方式:win+R组合键或者右键点击win10开始菜单,点击“运行”查看系统版本:win ...
- PHP实现Redis分布式锁
锁在我们的日常开发可谓用得比较多.通常用来解决资源并发的问题.特别是多机集群情况下,资源争抢的问题.但是,很多新手在锁的处理上常常会犯一些问题.今天我们来深入理解锁. 一.Redis 锁错误使用之一 ...
- php使用inotify扩展监控文件或目录,如果发生改变,就执行指定命令
通过inotify扩展监控文件或目录的变化,如果发生变化,就执行命令. 可以应用于 swoole 中,如果文件发生变化,就执行 kill -USR1 进程PID 来实现热更新. <?php cl ...
- oracle 关联更新
不多说了,我们来做实验吧. 创建如下表数据 select * from t1 ; select * from t2; 现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致. 方式1,u ...
- LinqMethod 实现 LeftJoin
LinqMethod 实现 LeftJoin Intro 有时候我们想实现 leftJoin 但是 Linq 提供的 Join 相当于是 INNER JOIN,于是就打算实现一个 LeftJoin 的 ...
- du 配合sort查看文件夹大小
du -s * | sort -nr | head 选出排在前面的10个 du -s * | sort -nr | tail 选出排在后面的10个
- 解决:perl: warning: Please check that your locale settings
问题: perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LAN ...