树剖板子复杂度疑似退化求调
查看原帖
树剖板子复杂度疑似退化求调
933802
ICU152_lowa_IS8楼主2024/10/25 04:57

TLE 12pts

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int v,w,next;
}edge[1000005<<2];
int head[1000005],num;
void add(int u,int v,int w){
	edge[++num].next=head[u];
	head[u]=num;
	edge[num].w=w;
	edge[num].v=v;
}
int son[1000005],fa[1000005],dep[1000005],siz[1000005];
int top[1000005],id[1000005],tmp[1000005],cnt;
int t[1000005];
void dfs1(int now,int fath,int deep){
	fa[now]=fath;
	dep[now]=deep;
	siz[now]=1;
	int maxson=-1;
	for(int i=head[now];i;i=edge[i].next){
		int v=edge[i].v;
		if(v==fath)continue;
		dfs1(v,now,deep+1);
		if(siz[v]>maxson){
			maxson=siz[v];
			son[now]=v;
		}
		siz[now]+=siz[v];
	}
}
void dfs2(int now,int topf){
	top[now]=topf;
	id[now]=++cnt;
	t[cnt]=now;
	tmp[cnt]=1;
	if(!son[now])return;
	dfs2(son[now],now);
	for(int i=head[now];i;i=edge[i].next){
		int v=edge[i].v;
		if(v==fa[now]||v==son[now])continue;
		dfs2(v,v);
	}
}
struct tree{
	int val,tag;
}tree[4000005];
int a[1000005];
inline int ls(int p){
	return p<<1;
}
inline int rs(int p){
	return p<<1|1;
}
inline void pushup(int p){
	tree[p].val=tree[ls(p)].val+tree[rs(p)].val;
}
inline void pushdown(int p,int l,int r){
	if(!tree[p].tag)return;
	int mid=l+r>>1;
	tree[ls(p)].val=mid-l+1-tree[ls(p)].val;
	tree[rs(p)].val=r-mid-tree[rs(p)].val;
	tree[ls(p)].tag^=1;
	tree[rs(p)].tag^=1;
	tree[p].tag=0;
}
inline void update(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql){
		return;
	}
	if(qr>=r&&ql<=l){
		tree[p].val=(r-l+1)-tree[p].val; 
		tree[p].tag^=1;
		return;
	}
	int mid=l+r>>1;
	pushdown(p,l,r);
	update(ls(p),l,mid,ql,qr);
	update(rs(p),mid+1,r,ql,qr);
	pushup(p);
}
inline int query(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql)return INT_MAX;
	if(l==r)return l;
	int ct=INT_MAX;
	int mid=l+r>>1;
//	cout<<t
	if(tree[ls(p)].val>0&&!(l>qr||mid<ql)){
		ct=query(ls(p),l,mid,ql,qr);
	}
	if(ct!=INT_MAX)return ct;
	if(tree[rs(p)].val>0&&!(mid+1>qr||r<ql)){
		ct=query(rs(p),mid+1,r,ql,qr);
	}
//	cout<<ct<<" "<<l<<" "<<r<<" "<<tree[ls(p)].val<<" "<<tree[rs(p)].val<<endl;
	return ct;
}
	int n;
inline int queryx(int x,int y){
	int ans=INT_MAX;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans=min(ans,query(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ans=min(ans,query(1,1,n,id[x],id[y]));
	return ans==INT_MAX?-1:ans;
}
signed main(){
	ios::sync_with_stdio(false);
	int q;
	cin>>n>>q;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v,0);
		add(v,u,0);
	}
	dfs1(1,0,1);
	dfs2(1,1);
	while(q--){
		int op,v;
		cin>>op>>v;
		if(op==0){
			update(1,1,n,id[v],id[v]);
		}
		else{
			cout<<((queryx(1,v)==-1)?-1:t[queryx(1,v)])<<"\n";
		}
	}
	return 0;
}

2024/10/25 04:57
加载中...