萌新刚学树剖,练习树剖写了这道题,怎么也看不出来错误,24pts 求助/kk
查看原帖
萌新刚学树剖,练习树剖写了这道题,怎么也看不出来错误,24pts 求助/kk
298549
SIXIANG32楼主2020/12/20 20:13
#include<iostream>
#include<vector>
#include<algorithm>
#define MAXN 1000000
#define TESTOUT cout<<"TEST"<<endl; 
using namespace std;
int siz[MAXN+10],fa[MAXN+10],son[MAXN+10],de[MAXN+10];
int ind[MAXN+10],top[MAXN+10],who[MAXN+10],cnt=0;
int a[MAXN+10],f[4*MAXN+10];
//更赛牛 1 和赛牛 0 
int n,m;
vector<int>tree[MAXN+10];
int ls(int x){return (x<<1);  }
int rs(int x){return (x<<1|1);}
void build(int l,int r,int now)
{
	if(l==r)
	{
		f[now]=a[who[l]];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid  ,ls(now));
	build(mid+1,r,rs(now));
	f[now]=f[ls(now)]+f[rs(now)];
}
int ask_sum(int l,int r,int s,int t,int now)
{
	int mid=(s+t)>>1,sum=0;
	if(l<=s&&r>=t)return f[now];
	if(l<=mid)sum+=ask_sum(l,r,s,mid  ,ls(now));
	if(r> mid)sum+=ask_sum(l,r,mid+1,t,rs(now));
	return sum;
}
void dfs1(int u,int fat)
{
	int maxn=-0x3f3f3f3f;
	siz[u]=1,fa[u]=fat,de[u]=de[fat]+1;
	for(int p=0;p<tree[u].size();p++)
	{
		int v=tree[u][p];
		if(v!=fat)
		{
			dfs1(v,u);
			siz[u]+=siz[v];
			if(siz[v]>maxn)
				son[u]=v,maxn=siz[v];
		}
	}
}
void dfs2(int u,int T)
{
	ind[u]=++cnt,top[u]=T,who[cnt]=u;
	if(!son[u])return ;
	dfs2(son[u],T);
	for(int p=0;p<tree[u].size();p++)
	{
		int v=tree[u][p];
		if(v!=fa[u]&&v!=son[u])
			dfs2(v,v);
	}
}
bool check(int u,int v,int k)
{
	int sum=0,cu=u,cv=v;
	while(top[u]!=top[v])
	{
		if(de[top[u]]<de[top[v]])swap(u,v);
		sum+=ask_sum(ind[top[u]],ind[u],1,n,1);
		u=fa[top[u]];
	}
	if(de[u]>de[v])swap(u,v);
	sum+=ask_sum(ind[u],ind[v],1,n,1);
	
	int LCA=u,dis=de[cu]+de[cv]-2*de[LCA];
	if(k)return (sum);
	else return (sum<dis);
	return sum;
} 
int main()
{
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>n>>m;
	char ch;
	for(int p=1;p<=n;p++)
		cin>>ch,a[p]=((ch=='G')?(1):(0));
	for(int p=1,x,y;p<n;p++)
	{
		cin>>x>>y;
		tree[x].push_back(y);
		tree[y].push_back(x);
	}
	dfs1(1,-1),dfs2(1,1),build(1,n,1);
	for(int p=1,u,v;p<=m;p++)
	{
		cin>>u>>v>>ch;
		cout<<check(u,v,((ch=='G')?(1):(0)));
	}
}

一定是很 SB 的错误,可是我没看出来/kk
应该是眼瞎
求助 awa

2020/12/20 20:13
加载中...