QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#950040#10226. Tree FlipUESTC_NLNSRE 3ms28204kbC++143.6kb2025-03-24 18:47:172025-03-24 18:47:18

Judging History

This is the latest submission verdict.

  • [2025-03-24 18:47:18]
  • Judged
  • Verdict: RE
  • Time: 3ms
  • Memory: 28204kb
  • [2025-03-24 18:47:17]
  • Submitted

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 ...

output:


result: