QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#950040 | #10226. Tree Flip | UESTC_NLNS | RE | 3ms | 28204kb | C++14 | 3.6kb | 2025-03-24 18:47:17 | 2025-03-24 18:47:18 |
Judging History
answer
#include<bits/stdc++.h>
#define lc(x) t[x].lc
#define rc(x) t[x].rc
#define k1 (k<<1)
#define k2 (k<<1|1)
#define mid ((l+r)>>1)
using namespace std;
class Segment_tree{
public:
vector<int> sum,rev;
void build(int k,int l,int r,vector<int> s)
{
if(l==r) {sum[k]=s[l];return;}
build(k1,l,mid,s);
build(k2,mid+1,r,s);
sum[k]=sum[k1]+sum[k2];
return;
}
void init(vector<int> s)
{
int n=s.size()-1;
sum.resize(n*4+10);
rev.resize(n*4+10);
build(1,1,n,s);
return;
}
void clear()
{
sum.clear();
rev.clear();
}
void Rev(int k,int l,int r)
{
sum[k]=r-l+1-sum[k];
rev[k]^=1;
return;
}
void pushdown(int k,int l,int r)
{
if(rev[k])
{
Rev(k1,l,mid);
Rev(k2,mid+1,r);
rev[k]=0;
}
return;
}
void reverse(int k,int l,int r,int x,int y)
{
if(x<=l&&y>=r) {Rev(k,l,r);return;}
pushdown(k,l,r);
if(x<=mid) reverse(k1,l,mid,x,y);
if(y>mid) reverse(k2,mid+1,r,x,y);
sum[k]=sum[k1]+sum[k2];
return;
}
int query(int k,int l,int r,int x,int y,int tp)
{
if(x>y) return 0;
if(x<=l&&y>=r) return tp?sum[k]:r-l+1-sum[k];
pushdown(k,l,r);int res=0;
if(x<=mid) res+=query(k1,l,mid,x,y,tp);
if(y>mid) res+=query(k2,mid+1,r,x,y,tp);
return res;
}
};
const int N=1e5+5,INF=0x3f3f3f3f;
struct node{
int fa,fx;
Segment_tree T;
vector<int> col;
unordered_map<int,int> dfn,siz;
node() {T.clear();dfn.clear();siz.clear();col.resize(1);return;}
void clear()
{
T.clear();
dfn.clear();
siz.clear();
col.resize(1);
fa=fx=0;
return;
}
int size() {return col.size()-1;}
}p[N];
vector<int> e[N];
int siz[N],mx[N];
int T,n,q,s[N];
bool vis[N];
void Dfs1st(int x,int fa,int SIZ,int &rt)
{
siz[x]=1;mx[x]=0;
for(auto v:e[x])
{
if(vis[v]||v==fa) continue;
Dfs1st(v,x,SIZ,rt);
siz[x]+=siz[v];
mx[x]=max(mx[x],siz[v]);
}
mx[x]=max(mx[x],SIZ-siz[x]);
if(!rt||mx[x]<mx[rt]) rt=x;
return;
}
void Dfs2nd(int x,int fa,int rt)
{
int dfc=p[rt].size()+1;
p[rt].dfn[x]=dfc;
p[rt].siz[x]=1;
p[rt].col.push_back(s[x]^p[rt].col[fa]);
for(auto v:e[x])
{
if(v==fa||vis[v]) continue;
Dfs2nd(v,x,rt);
p[rt].siz[x]+=p[rt].siz[v];
}
return;
}
int build_tree(int x,int fa,int siz)
{
int rt=0;mx[0]=INF;
Dfs1st(x,0,siz,rt);
vis[rt]=true;
p[rt].clear();
p[rt].fx=x;
p[rt].fa=fa;
Dfs2nd(rt,0,rt);
p[rt].T.init(p[rt].col);
for(auto v:e[rt])
{
if(v==fa||vis[v]) continue;
build_tree(v,rt,p[rt].siz[v]);
}
return rt;
}
void change(int x,int y)
{
if(!x) return;
int l=p[x].dfn[y],r=l+p[x].siz[y]-1;
p[x].T.reverse(1,1,p[x].size(),l,r);
change(p[x].fa,y);
return;
}
int query(int x,int y,int z)
{
if(!x) return 0;
int col=p[x].T.query(1,1,p[x].size(),p[x].dfn[z],p[x].dfn[z],1);
int res=0,tp=col^s[x]^1;
if(!y) return query(p[x].fa,p[x].fx,z)+p[x].T.query(1,1,p[x].size(),1,p[x].size(),tp);
int l=p[x].dfn[y],r=l+p[x].siz[y]-1;
res+=p[x].T.query(1,1,p[x].size(),1,l-1,tp)+p[x].T.query(1,1,p[x].size(),r+1,p[x].size(),tp);
res+=query(p[x].fa,p[x].fx,z);
return res;
}
int a,b;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--)
{
cin>>n>>q;
for(int i=1;i<=n;i++) vis[i]=0,e[i].clear();
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<n;i++)
{
cin>>a>>b;
e[a].push_back(b);
e[b].push_back(a);
}
int rt=1;
build_tree(1,0,n);
for(int i=1;i<=q;i++)
{
cin>>a>>b;
if(a==1) change(b,b),s[b]^=1;
else rt=b;
cout<<query(rt,0,rt)<<"\n";
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 3ms
memory: 28204kb
input:
1 3 3 0 0 1 1 2 3 1 1 1 2 2 1 1
output:
2 1 1
result:
ok 3 lines
Test #2:
score: -100
Runtime Error
input:
1 100000 100000 0 0 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 ...