所有测试点 TLE 求助
  • 板块P6021 洪水
  • 楼主g1ove
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/2/26 10:59
  • 上次更新2024/2/26 16:42:32
查看原帖
所有测试点 TLE 求助
638537
g1ove楼主2024/2/26 10:59

rt 调不出来 qwq

#include<bits/stdc++.h>
#define inf 1e9
#define N 200005
using namespace std;
struct matrix{
	int r[3][3];
}g[N],c;
matrix operator *(matrix a,matrix b)
{
	for(int i=0;i<2;i++)
		for(int j=0;j<2;j++)
			c.r[i][j]=inf;
	for(int i=0;i<2;i++)
		for(int j=0;j<2;j++)
			for(int k=0;k<2;k++)
				c.r[i][j]=min(c.r[i][j],a.r[i][k]+b.r[k][j]);
	return c;
}
int head[N],tot=1;
struct edge{
	int to,next;
}e[N*2];
void add(int u,int v)
{
	e[tot]=(edge){v,head[u]};
	head[u]=tot++;
}
int n,m;
int w[N],f[N];
int fa[N],dep[N],siz[N],Son[N];
void dfs1(int now,int fath)
{
	siz[now]=1;
	fa[now]=fath;
	dep[now]=dep[fath]+1;
	int maxx=0;
	for(int i=head[now];i;i=e[i].next)
	{
		int son=e[i].to;
		if(son==fath) continue;
		dfs1(son,now);
		siz[now]+=siz[son];
		if(siz[son]>maxx) maxx=siz[son],Son[now]=son;
		f[now]+=f[son];
	}
	if(Son[now]) f[now]=min(f[now],w[now]);
	else f[now]=w[now];
}
int top[N],id[N],ids,ed[N],pos[N];
void dfs2(int now,int topf)
{
	top[now]=topf;
	id[now]=ed[topf]=++ids;
	pos[ids]=now;
	g[now].r[0][0]=g[now].r[1][0]=g[now].r[1][1]=0;
	g[now].r[0][1]=w[now];
	if(!Son[now]) return;
	dfs2(Son[now],topf);
	for(int i=head[now];i;i=e[i].next)
	{
		int son=e[i].to;
		if(son==Son[now]||son==fa[now]) return;
		dfs2(son,son);
		g[now].r[0][0]+=f[son];
	}
}
matrix tr[N*4];
void modify(int l,int r,int p,int x)
{
	if(l==r)
	{
		tr[x]=g[pos[p]];
		return;
	}
	int mid=(l+r)/2;
	if(p<=mid) modify(l,mid,p,x*2);
	else modify(mid+1,r,p,x*2+1);
	tr[x]=tr[x*2]*tr[x*2+1];
}
matrix query(int l,int r,int L,int R,int x)
{
	if(l>=L&&r<=R) return tr[x];
	int mid=(l+r)/2;
	if(R<=mid) return query(l,mid,L,R,x*2);
	if(L>mid) return query(mid+1,r,L,R,x*2+1);
	return query(l,mid,L,R,x*2)*query(mid+1,r,L,R,x*2+1); 
}
matrix lst,now;
void updata(int x,int v)
{
	g[x].r[0][1]+=v;
	w[x]+=v;
	while(x)
	{
		lst=query(1,n,id[top[x]],ed[top[x]],1);
		modify(1,n,id[x],1);
		now=query(1,n,id[top[x]],ed[top[x]],1);
		x=fa[top[x]];
		g[x].r[0][0]+=now.r[0][1]-lst.r[0][1];
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
	for(int i=1;i<=n;i++)
		modify(1,n,i,1);
	scanf("%d",&m);
	while(m--)
	{
		char c;
		int x,y;
		cin>>c;
		if(c=='Q')
		{
			scanf("%d",&x);
			printf("%d\n",(query(1,n,id[x],ed[top[x]],1)).r[0][1]);
		}
		else
		{
			scanf("%d%d",&x,&y);
			updata(x,y);
		}
	}
	return 0;
}

2024/2/26 10:59
加载中...