莫名爆栈
查看原帖
莫名爆栈
226435
天命之路楼主2020/5/25 12:23

RTRT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=2e5+5;
ll fir[N],nxt[N<<1],to[N<<1],val[N],sum[N<<2],ect=0;
ll fa[N],dep[N],sze[N],son[N],top[N],seg[N],rev[N];
inline void addedge(int u1,int v1)
{
	nxt[++ect]=fir[u1];fir[u1]=ect;to[ect]=v1;
}
int total=0;
inline void dfs1(int u,int f)
{
	dep[u]=dep[f]+1;
	sze[u]=1;fa[u]=f;
	//total++;
	//if(total>50000) exit(0);
	for(int i=fir[u];i;i=nxt[i])
	{
		int v=to[i];
		if(v==f) continue;
		dfs1(v,u);
		sze[u]+=sze[v];
		if(sze[v]>sze[son[u]]) son[u]=v;
	}
}
inline void dfs2(int u,int f)
{
	if(son[u])
	{
		seg[son[u]]=++seg[0];
		rev[seg[son[u]]]=son[u];
		top[son[u]]=top[u];
		dfs2(son[u],u);
	}
	for(int i=fir[u];i;i=nxt[i])
	{
		int v=to[i];
		if(top[v]) continue;
		seg[v]=++seg[0];
		rev[seg[v]]=v;
		top[v]=v;
		dfs2(v,u);
	}
}
ll add[N<<2];
inline void build(int k,int l,int r)
{
	if(l==r)
	{
		sum[k]=val[rev[l]];
		return;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	sum[k]=sum[k<<1]+sum[k<<1|1];
}
inline void Add(int k,int l,int r,int v)
{
	add[k]+=v;
	sum[k]+=(r-l+1)*v;
}
inline void pushdown(int k,int l,int r,int mid)
{
	if(add[k]==0) return;
	Add(k<<1,l,mid,add[k]);
	Add(k<<1|1,mid+1,r,add[k]);
	add[k]=0;
}
inline void change(int k,int l,int r,int x,int y,int v)
{
	if(l>y||r<x) return;
	if(x<=l&&r<=y)
	{
		Add(k,l,r,v);
		return;
	}
	int mid=l+r>>1;
	pushdown(k,l,r,mid);
	change(k<<1,l,mid,x,y,v);
	change(k<<1|1,mid+1,r,x,y,v);
	sum[k]=sum[k<<1]+sum[k<<1|1];
}
inline ll query(int k,int l,int r,int x,int y)
{
	if(l>y||r<x) return 0ll;
	if(x<=l&&r<=y) return sum[k];
	int mid=l+r>>1;
	pushdown(k,l,r,mid);
	return query(k<<1,l,mid,x,y)+query(k<<1|1,mid+1,r,x,y);
}
ll n,m;
int main()
{
//	freopen("P3178_2.in","r",stdin);
//	freopen("p3178.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&val[i]);
	for(int i=1;i<n;i++)
	{
		int t1,t2;
		scanf("%lld%lld",&t1,&t2);
		addedge(t1,t2);addedge(t2,t1);
	}
	dfs1(1,0);
	exit(0);
	seg[0]=seg[1]=rev[1]=top[1]=1;
	dfs2(1,0);
	build(1,1,seg[0]);
	for(int i=1;i<=m;i++)
	{
		int opt,x;ll a;
		scanf("%lld%lld",&opt,&x);
		
			if(opt==1)
			{
				scanf("%lld",&a);
				change(1,1,seg[0],seg[x],seg[x],a);
				
			}
			else if(opt==2)
			{
				scanf("%lld",&a);
				
//				while(fx!=1)
//				{
//					change(1,1,seg[0],seg[fx],seg[x],a);
//					x=fa[fx];fx=top[x];
//				}
//				change(1,1,seg[0],seg[1],seg[x],a);
//				
				change(1,1,seg[0],seg[x],seg[x]+sze[x]-1,a);
			}
			else
			{
				int fx=top[x];
				ll res=0;
				while(fx!=1)
				{
					res+=query(1,1,seg[0],seg[fx],seg[x]);
					x=fa[fx];fx=top[x];
				}
				res+=query(1,1,seg[0],seg[1],seg[x]);
				printf("%lld\n",res);
			}
				
			
				
			
		}
	
}

限制 dfs 次数在50000以内,第二组数据在本地上还是爆系统栈了(在机房打欧拉回路时也这样,现在的系统栈容量是1吗)

2020/5/25 12:23
加载中...