社区讨论
有大佬 #6 WA 过吗?
CF343DWater Tree参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo1buc9x
- 此快照首次捕获于
- 2023/10/22 18:29 2 年前
- 此快照最后确认于
- 2023/11/02 18:51 2 年前
自闭,数据真大。
CPP#include<bits/stdc++.h>
#define dbgvar(x) printf("%s = ",#x);cout << x << endl;
#define dbgarr(x,len) printf("show %s: ",#x);\
for(int ccf = 1;ccf <= len;ccf ++){\
cout << x[ccf] << " ";\
}\
cout << endl;
using namespace std;
const int N = 500005;
vector<int> e[N];
int n,m;
int son[N],depth[N],fa[N],siz[N];
int dfn[N],rnk[N],top[N],idx;
void dfs1(int u){//求出重儿子、子树大小、父亲、深度
son[u] = -1;
siz[u] = 1;
for(auto v:e[u]){
if(depth[v])continue;
depth[v] = depth[u] + 1;
fa[v] = u;
dfs1(v);
siz[u] += siz[v];
if(son[u] == -1 || siz[son[u]] < siz[v]){
son[u] = v;
}
}
}
void dfs2(int u,int t){//求出dfs序,重链顶端
dfn[u] = ++idx;
rnk[u] = idx;
top[u] = t;
if(son[u] != -1){
dfs2(son[u],t);
}
for(auto v:e[u]){
if(fa[u] == v || son[u] == v)continue;
dfs2(v,v);
}
}
struct node{
int l,r;
int tag;
int dat;
}tr[N*4];
void pushup(int u){
tr[u].dat = tr[u<<1].dat + tr[u<<1|1].dat;
}
void pushdown(int u){
if(tr[u].tag != -1){
node &l = tr[u<<1];
node &r = tr[u<<1|1];
node &t = tr[u];
l.tag = r.tag = t.tag;
l.dat = (l.r - l.l + 1) * l.tag;
r.dat = (r.r - r.l + 1) * r.tag;
t.tag = -1;
}
}
void build(int u,int l,int r){
if(l == r){
tr[u] = {l,r,-1,0};
return;
}
tr[u].l = l,tr[u].r = r;
int mid = tr[u].l + tr[u].r >> 1;
build(u<<1,l,mid);build(u<<1|1,mid+1,r);
}
void modify(int u,int l,int r,int x){
if(l <= tr[u].l && tr[u].r <= r){
tr[u].tag = x;
tr[u].dat = (tr[u].r - tr[u].l + 1) * x;
return;
}
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid)modify(u<<1,l,r,x);
if(r > mid)modify(u<<1|1,l,r,x);
pushup(u);
}
int query(int u,int x){
if(tr[u].l == x && tr[u].r == x)
return tr[u].dat;
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid)return query(u<<1,x);
else return query(u<<1|1,x);
}
void settree(int u){
modify(1,dfn[u],dfn[u]+siz[u]-1,1);
}
void clear(int u){
while(top[u] != 1){
modify(1,dfn[top[u]],dfn[u],0);
u = fa[top[u]];
}
modify(1,dfn[1],dfn[u],0);
}
int main(){
cin >> n;
for(int i = 1;i < n;i ++){
int x,y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
depth[1] = 1;
fa[1] = 1;
dfs1(1);
top[1] = 1;
dfs2(1,1);
// dbgarr(fa,n);
// dbgarr(son,n);
// dbgarr(depth,n);
// dbgarr(siz,n);
// dbgarr(dfn,n);
// dbgarr(top,n);
build(1,1,n);
cin >> m;
while(m --){
int op,x;
cin >> op >> x;
if(op == 1)settree(x);
if(op == 2)clear(x);
if(op == 3) cout << query(1,x) << endl;
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...