萌新不知道为什么又T又WA的31pts
查看原帖
萌新不知道为什么又T又WA的31pts
117648
CasseroleGoose楼主2020/12/1 23:03
#include<bits/stdc++.h>
#define F(i,l,r) for(register int i=l;i<=r;i++)
#define D(i,r,l) for(register int i=r;i>=l;i--)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define p_b push_back
#define m_p make_pair
#define il inline
#define fi first
#define se second
const int INF=0x3f3f3f3f,N=1e5+5;
using namespace std;
int n,m;
int u,v;
struct node {
	int from,to,val,nxt;
}e[N<<1];
int ecnt,head[N];
void add(int u,int v) {
	e[++ecnt].from=u;
	e[ecnt].to=v;
	e[ecnt].nxt=head[u];
	head[u]=ecnt;
}
int fa[N],dep[N],top[N],son[N],siz[N],pos[N],cnt;
char op[2];
void dfs1(int now,int pre) {
	fa[now]=pre,dep[now]=dep[pre]+1,siz[now]=1;
	for(int i=head[now];~i;i=e[i].nxt) {
		int to=e[i].to;
		if(to!=pre) {
			dfs1(to,now);
			siz[now]+=siz[to];
			if(siz[son[now]]<siz[to]) son[now]=to;
		}
	}
}
void dfs2(int now,int pre) {
	if(son[now]) {
		top[son[now]]=top[now];
		pos[son[now]]=++cnt;
		dfs2(son[now],now);
	}
	else return ;
	for(int i=head[now];~i;i=e[i].nxt) {
		int to=e[i].to;
		if(to!=pre&&to!=son[now]) {
			top[to]=to;
			pos[to]=++cnt;
			dfs2(to,now);
		}
	}
}
ll ans[N<<2],tag[N<<2];
il int ls(int x) {return x<<1;}
il int rs(int x) {return x<<1|1;}
il void push_up(int p) {ans[p]=ans[ls(p)]+ans[rs(p)];}
il void f(int p,int l,int r,ll k) {
	ans[p]+=(r-l+1)*k;
	tag[p]+=k;
}
il void push_down(int p,int l,int r) {
	if(tag[p]) {
		int mid=(l+r)>>1;
		f(ls(p),l,mid,tag[p]);
		f(rs(p),mid+1,r,tag[p]);
		tag[p]=0;
	}
}
il void upd(int p,int l,int r,int nl,int nr,ll k) {
	if(nl<=l&&nr>=r) {
		f(p,l,r,k);
		return ;
	}
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(nl<=mid) upd(ls(p),l,mid,nl,nr,k);
	if(nr>mid) upd(rs(p),mid+1,r,nl,nr,k);
	push_up(p);
}
il ll query(int p,int l,int r,int ql,int qr) {
	if(ql<=l&&qr>=r) return ans[p];
	push_down(p,l,r);
	int mid=(l+r)>>1;ll res=0;
	if(ql<=mid) res+=query(ls(p),l,mid,ql,qr);
	if(qr>mid) res+=query(rs(p),mid+1,r,ql,qr);
	return res;
}
il int upd_chain(int u,int v,int k) {
	int fu=top[u],fv=top[v];
	while(fu!=fv) {
		if(dep[fu]<dep[fv]) swap(fu,fv),swap(u,v);
		upd(1,1,n,pos[fu],pos[u],k);
		u=fa[u],fu=top[u];
	}
	if(dep[u]>dep[v]) swap(u,v);
	upd(1,1,n,pos[u]+1,pos[v],k);
}
int main() {
	mem(head,-1);
	scanf("%d%d",&n,&m);
	F(i,1,n-1) {
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	dfs1(1,0);dep[1]=1;cnt=pos[1]=1,top[1]=1;dfs2(1,0);
	while(m--) {
		scanf("%s %d%d",op,&u,&v);
		if(op[0]=='P') {
			upd_chain(u,v,1);
		}
		if(op[0]=='Q') {
			if(fa[u]==v) printf("%lld\n",query(1,1,n,pos[u],pos[u]));
			else printf("%lld\n",query(1,1,n,pos[v],pos[v]));
		}
	}
	return 0;
}

求助神仙!

2020/12/1 23:03
加载中...