求助!
  • 板块题目总版
  • 楼主sane1981
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/4 10:50
  • 上次更新2023/10/23 23:10:37
查看原帖
求助!
801978
sane1981楼主2023/3/4 10:50

蒟蒻的树链剖分代码,一直31分,不知错哪里?求助路过神犇!——初二党的一个蒟蒻

原题:P3038

WA_CODE
#include<bits/stdc++.h>
#define mid ((l+r)>>1)
using namespace std;
const int N=100005;
int n,m,a,b;
char c;
int head[N],tot;
struct edge{
	int next,to;
}g[N*2];
struct node{
	int sum,lazy;
}xds[N<<2];
void add(int u,int v){
	g[++tot].next=head[u];
	g[tot].to=v;
	head[u]=tot;
}
int top[N],size[N],deep[N],f[N],id[N],son[N];
void DFS1(int u,int fa){
	deep[u]=deep[fa]+1;
	f[u]=fa;
	size[u]=1;
	for(int i=head[u];~i;i=g[i].next){
		if(g[i].to==f[u]) continue;
		DFS1(g[i].to,u);
		size[u]+=size[g[i].to];
		if(!son[u]||size[son[u]]<size[g[i].to]) son[u]=g[i].to;
	}
	return;
}
int dfnum;
void DFS2(int u,int topu){
	id[u]=++dfnum;
	top[u]=topu;
	if(!son[u]) return;
	DFS2(son[u],topu);
	for(int i=head[u];~i;i=g[i].next){
		int v=g[i].to;
		if(v==f[u]||v==son[u]) continue;
		DFS2(v,v);
	}
}
void pushdown(int k,int l,int r){
	if(!xds[k].lazy) return;
	xds[k<<1].lazy++;xds[k<<1|1].lazy++;
	xds[k<<1].sum+=(mid-l+1);xds[k<<1|1].sum+=(r-mid);
	xds[k].lazy=0;
}
void Modify(int l,int r,int ll,int rr,int k){
	if(l>=ll&&r<=rr){
		xds[k].lazy++;xds[k].sum+=(r-l+1);
		return;
	}
	pushdown(k,l,r);
	if(ll<=mid) Modify(l,mid,ll,rr,k<<1);
	if(rr>mid) Modify(mid+1,r,ll,rr,k<<1|1);
	xds[k].sum=xds[k<<1].sum+xds[k<<1|1].sum;  
}
int Query(int l,int r,int z,int k){
	if(l==r) return xds[k].sum;
	pushdown(k,l,r);
	if(z<=mid) return Query(l,mid,z,k<<1);
	if(z>mid) return Query(mid+1,r,z,k<<1|1);
}
void UpdataLink(int u,int v){
	while(top[u]!=top[v]){
		if(deep[top[u]]<deep[top[v]]) swap(u,v);
		Modify(1,n,id[top[u]],id[u],1);
		u=f[top[u]]; 
	}
	if(deep[u]>deep[v]) swap(u,v);
	if(u!=v) Modify(1,n,id[u]+1,id[v],1); 
}
int main(){
//	freopen("P3038_2.in","r",stdin);
//	freopen("P3038_my.out","w",stdout);
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;i++){
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	DFS1(1,0);
	DFS2(1,1);
	while(m--){
		scanf("%s%d%d",&c,&a,&b);
		if(c=='P') UpdataLink(a,b);
		else if(c=='Q'){
			int t=b;
			if(deep[a]>deep[b]) t=a;
			printf("%d\n",Query(1,n,id[t],1));
		}
	}
	return 0;
} 

Orz

2023/3/4 10:50
加载中...