求助树剖
查看原帖
求助树剖
537046
大眼仔Happy楼主2024/3/31 15:48

rt,这样只有 30pts。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int inline read()
{
	int num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
int n,m,a[N],col[N];char ch[5];
struct edge{int u,v,nxt;}e[N<<1];
int cnt,head[N];
void add(int u,int v){e[++cnt]=(edge){u,v,head[u]};head[u]=cnt;}
struct Segment_Tree
{
	int t[N<<2],tag[N<<2];
	#define ls (k<<1)
	#define rs (k<<1|1)
	#define mid (l+r>>1)
	void up(int k,int l,int r){t[k]=t[ls]+t[rs]-(col[mid]==col[mid+1]);}
	void LT(int k,int l,int r,int v){col[l]=col[r]=tag[k]=v;t[k]=1;}
	void down(int k,int l,int r){if(tag[k])LT(ls,l,mid,tag[k]),LT(rs,mid+1,r,tag[k]),tag[k]=0;}
	void build(int k,int l,int r)
	{
		if(l==r)return t[k]=1,void();
		build(ls,l,mid);build(rs,mid+1,r);up(k,l,r);
	}
	void upd(int k,int l,int r,int ql,int qr,int v)
	{
		if(ql<=l&&r<=qr)return LT(k,l,r,v);
		down(k,l,r);
		if(ql<=mid)upd(ls,l,mid,ql,qr,v);
		if(qr>mid)upd(rs,mid+1,r,ql,qr,v);
		up(k,l,r);
	}
	int ask(int k,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)return t[k];
		down(k,l,r);
		if(ql<=mid&&qr>mid)return ask(ls,l,mid,ql,qr)+ask(rs,mid+1,r,ql,qr)-(col[mid]==col[mid+1]);
		if(ql<=mid)return ask(ls,l,mid,ql,qr);
		else return ask(rs,mid+1,r,ql,qr);
	}
	#undef ls
	#undef rs
	#undef mid
}T;
int tim,siz[N],fa[N],dep[N],son[N],dfn[N],top[N];
void upd(int u,int v,int w)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		T.upd(1,1,n,dfn[top[u]],dfn[u],w);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	T.upd(1,1,n,dfn[u],dfn[v],w);
}
int ask(int u,int v)
{
	int res=0;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res+=T.ask(1,1,n,dfn[top[u]],dfn[u])-(col[dfn[top[u]]]==col[dfn[fa[top[u]]]]);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	res+=T.ask(1,1,n,dfn[u],dfn[v]);
	return res;
}
void dfs(int u)
{
	siz[u]=1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;if(v==fa[u])continue;
		fa[v]=u;dep[v]=dep[u]+1;dfs(v);
		siz[u]+=siz[v];
		if(siz[son[u]]<siz[v])son[u]=v;
	}
}
void dfs(int u,int tid)
{
	dfn[u]=++tim;col[tim]=a[u];top[u]=tid;
	if(!son[u])return;
	dfs(son[u],tid);
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==fa[u]||v==son[u])continue;
		dfs(v,v);
	}
}
int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1,u,v;i<n;i++)u=read(),v=read(),add(u,v),add(v,u);
	dep[1]=1;dfs(1);dfs(1,1);
	T.build(1,1,n);
	while(m--)
	{
		scanf("%s",ch);
		int u=read(),v=read();
		if(ch[0]=='C')upd(u,v,read());
		else printf("%d\n",ask(u,v));
	}
	return 0;
}

这样却可以 AC。

int ask(int u,int v)
{
	int res=0,x=u,y=v;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res+=T.ask(1,1,n,dfn[top[u]],dfn[u]);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	res+=T.ask(1,1,n,dfn[u],dfn[v]);
	u=x;v=y;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res-=(col[dfn[top[u]]]==col[dfn[fa[top[u]]]]);
		u=fa[top[u]];
	}
	return res;
}

Why

2024/3/31 15:48
加载中...