50ptsRE不解
查看原帖
50ptsRE不解
586932
White_Wat楼主2024/7/11 19:51

跑RE了,第一个测试点下下来跑到dfs1中报错,不理解

#include<bits/stdc++.h>

using namespace std;

const int N = 2000010, D = 2000010;

int read(){
	int re=0;
	char ch=getchar();
	while(!(ch>='0'&&ch<='9')) ch=getchar();
	while(ch>='0'&&ch<='9'){
		re=re*10+ch-'0';
		ch=getchar();
	}
	return re;
}
int n,m;
int cn,h[N];
struct E{
	int to,nex;
}e[N<<1];
void add(int u,int v){
	e[++cn].to=v,e[cn].nex=h[u],h[u]=cn;
}
int valve[N];
struct Tree_PF{
	int dep[N],f[N],siz[N],wc[N];
	void dfs1(int u,int fa){
		f[u]=fa,siz[u]=1,dep[u]=dep[fa]+1;
		//cout<<u<<' ';
		for(int i=h[u];i;i=e[i].nex){
			int v=e[i].to;
			//cout<<v<<' ';
			if(v==fa) continue;
			dfs1(v,u);
			siz[u]+=siz[v];
			if(siz[v]>siz[wc[u]]) wc[u]=v;
		}
		//cout<<endl;
	}
	int dfn[N],tottime,top[N];
	void dfs2(int u,int TOP){
		top[u]=TOP;
		if(wc[u]) dfs2(wc[u],TOP);
		for(int i=h[u];i;i=e[i].nex){
			int v=e[i].to;
			if(v==f[u]||v==wc[u]) continue;
			dfs2(v,v);
		}
	}
	int lca(int x,int y){
		while(top[x]!=top[y]){
			if(dep[top[x]]<dep[top[y]]) swap(x,y);
			x=f[top[x]];
		}
		return dep[x]<dep[y]?x:y;
	}
	int get_dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];}
}pf;
struct Segment_Tree{
	int cnt,d[D],root[N],ls[D],rs[D];
	void modify(int x,int s,int t,int &p,int c){
		if(!p) p=++cnt;
		if(s==t){
			d[p]+=c;
			return ;
		}
		int mid=(s+t)>>1;
		if(x<=mid) modify(x,s,mid,ls[p],c);
		else modify(x,mid+1,t,rs[p],c);
		d[p]=d[ls[p]]+d[rs[p]];
	}
	int get_sum(int l,int r,int s,int t,int p){
		if(!p) return 0;
		if(l<=s&&t<=r) return d[p];
		int mid=(s+t)>>1;
		int re=0;
		if(l<=mid) re=get_sum(l,r,s,mid,ls[p]);
		if(r>mid) re+=get_sum(l,r,mid+1,t,rs[p]);
		return re;
	}
}dis,chdis;
bool vis[N];
int rt,f[N],siz[N],maxu[N],sum;
void get_root(int u,int fa){
	siz[u]=1,maxu[u]=0;
	for(int i=h[u];i;i=e[i].nex){
			int v=e[i].to;
		if(v==fa||vis[v]) continue;
		get_root(v,u);
		siz[u]+=siz[v];
		maxu[u]=max(maxu[u],siz[v]);
	}
	maxu[u]=max(maxu[u],sum-siz[u]);
	if(maxu[u]<maxu[rt]) rt=u;
}
void pre(int u){
	vis[u]=1;
	for(int i=h[u];i;i=e[i].nex){
			int v=e[i].to;
		if(vis[v]) continue;
		rt=0,maxu[rt]=sum=siz[v];
		get_root(v,v),get_root(rt,rt);
		f[rt]=u;pre(rt);
	}
}
void modify(int u,int c){
	dis.modify(0,0,n,dis.root[u],c);
	for(int i=u;f[i];i=f[i]){
		int dist=pf.get_dis(u,f[i]);
		if(dist<0) continue;
		dis.modify(dist,0,n,dis.root[f[i]],c);
		chdis.modify(dist,0,n,chdis.root[i],c);
	}
}
int get_ans(int u,int k){
	int re=0;
	re+=dis.get_sum(0,k,0,n,dis.root[u]);
	for(int i=u;f[i];i=f[i]){
		int dist=k-pf.get_dis(u,f[i]);
		if(dist<0) continue;
		re+=dis.get_sum(0,dist,0,n,dis.root[f[i]]);
		re-=chdis.get_sum(0,dist,0,n,chdis.root[i]);
	}
	return re;
}
int ans;
int main(){
	freopen(".in","r",stdin);
	n=read(),m=read();
	for(int i=1;i<=n;i++) valve[i]=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v),add(v,u);
	}
	pf.dep[1]=-1;pf.dfs1(1,1)/*,pf.dfs2(1,1)*/;
	/*maxu[rt]=sum=n;
	get_root(1,1),get_root(rt,rt);
	pre(rt);
	for(int i=1;i<=n;i++) modify(i,valve[i]);
	while(m--){
		int opt=read(),x=read(),y=read();
		x^=ans,y^=ans;
		if(opt==0){
			ans=get_ans(x,y);
			printf("%d\n",ans);
		}
		else{
			modify(x,y-valve[x]);
			valve[x]=y;
		}
	}*/
	return 0;
}
2024/7/11 19:51
加载中...