求助,迷之TLE&RE
查看原帖
求助,迷之TLE&RE
536743
arrow_king楼主2024/2/25 19:36

本地跑能正常输出,测试的时候呈现出一个非常有对称感的图形,求助为什么会错,谢谢!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define ll long long
#define il inline
#define N 100005
#define lc(x) (x<<1)
#define rc(x) (x<<1)|1
il ll read() {
	ll x=0,f=1;char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') {f=-1;} c=getchar();}
	while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*f;
}
struct node {
	ll lclr,rclr,sum;
	node() {
	}
	node(ll _lclr,ll _rclr,ll _sum) {
		lclr=_lclr,rclr=_rclr,sum=_sum;
	}
};
struct sgt {
	ll l,r;
	ll lclr,rclr,sum,tag;
};
sgt tr[N<<2];
ll n,m;
vector<int> g[N];
ll fa[N],dep[N],son[N],siz[N],seg[N],rev[N],top[N],tot;
il void dfs1(ll u,ll f) {
	fa[u]=f,dep[u]=dep[f]+1,siz[u]=1;
	for(int i=0;i<g[u].size();i++) {
		ll v=g[u][i];
		if(v==f) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[son[u]]<siz[v]) son[u]=v;
	}
}
il void dfs2(ll u,ll f) {
	if(son[u]) {
		seg[son[u]]=++tot;
		rev[tot]=son[u];
		top[son[u]]=top[u];
		dfs2(son[u],u);
	}
	for(int i=0;i<g[u].size();i++) {
		ll v=g[u][i];
		if(!top[v]&&v!=f) {
			seg[v]=++tot;
			rev[tot]=v;
			top[v]=v;
			dfs2(v,u);
		}
	}
}
il void push_up(ll now) {
	tr[now].lclr=tr[lc(now)].lclr,tr[now].rclr=tr[rc(now)].rclr;
	tr[now].sum=tr[lc(now)].sum+tr[rc(now)].sum+(tr[lc(now)].rclr==tr[rc(now)].lclr);
}
il void build(ll now,ll l,ll r) {
	tr[now].l=l,tr[now].r=r,tr[now].sum=tr[now].tag=0;
	if(l==r) {
		tr[now].lclr=tr[now].rclr=-rev[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(lc(now),l,mid);
	build(rc(now),mid+1,r);
	push_up(now);
}
il void push_down(ll now) {
	if(tr[now].tag) {
		tr[lc(now)].lclr=tr[lc(now)].rclr=tr[now].tag;
		tr[lc(now)].sum=tr[lc(now)].r-tr[lc(now)].l;
		tr[lc(now)].tag=tr[now].tag;
		tr[rc(now)].lclr=tr[rc(now)].rclr=tr[now].tag;
		tr[rc(now)].sum=tr[rc(now)].r-tr[rc(now)].l;
		tr[rc(now)].tag=tr[now].tag;
		tr[now].tag=0;
	}
}
il void modify(ll nl,ll nr,ll l,ll r,ll now,ll k) {
	if(nl<=l&&r<=nr) {
		tr[now].lclr=tr[now].rclr=k;
		tr[now].sum=r-l;
		tr[now].tag=k;
		return;
	}
	push_down(now);
	ll mid=(l+r)>>1;
	if(nl<=mid) modify(nl,nr,l,mid,lc(now),k);
	if(mid<nr) modify(nl,nr,mid+1,r,rc(now),k);
	push_up(now);
}
il node query(ll qx,ll qy,ll l,ll r,ll now) {
	if(qx<=l&&r<=qy) return node(tr[now].lclr,tr[now].rclr,tr[now].sum);
	push_down(now);
	ll mid=(l+r)>>1;
	node ans=node(0,0,0);
	if(qy<=mid) return query(qx,qy,l,mid,lc(now));
	else if(mid<qx) return query(qx,qy,mid+1,r,rc(now));
	else {
		node ans1=query(qx,qy,l,mid,lc(now)),ans2=query(qx,qy,mid+1,r,rc(now));
		ans.lclr=ans1.lclr,ans.rclr=ans2.rclr;
		ans.sum=ans1.sum+ans2.sum+(ans1.rclr==ans2.lclr);
		return ans;
	}
}
il void cover(ll x,ll y,ll k) {
	ll fx=top[x],fy=top[y];
	while(fx!=fy) {
		if(dep[fx]<dep[fy]) {
			swap(x,y);
			swap(fx,fy);
		}
		modify(seg[fx],seg[x],1,n,1,k);
		x=fa[fx],fx=top[x];
	}
	if(dep[x]>dep[y]) swap(x,y);
	modify(seg[x],seg[y],1,n,1,k);
}
node Ans[2];
il ll ask(ll x,ll y) {
	ll fx=top[x],fy=top[y];
	Ans[0]=Ans[1]=node(19260817,19260817,0);
	bool flg=0;
	while(fx!=fy) {
		if(dep[fx]<dep[fy]) {
			swap(x,y),swap(fx,fy);
			flg^=1;
		}
		node tmp=query(seg[fx],seg[x],1,n,1);
		if(flg) Ans[1]=node(tmp.lclr,Ans[1].rclr,Ans[1].sum+tmp.sum+(Ans[1].lclr==tmp.rclr));
		else Ans[0]=node(Ans[0].lclr,tmp.lclr,Ans[0].sum+tmp.sum+(Ans[0].rclr==tmp.rclr));
		x=fa[fx],fx=top[x];
	}
	if(dep[x]>dep[y]) {
		swap(x,y);
		flg^=1;
	}
	node tmp=query(seg[x],seg[y],1,n,1);
	if(flg) Ans[1]=node(tmp.lclr,Ans[1].rclr,Ans[1].sum+tmp.sum+(Ans[1].lclr==tmp.rclr));
	else Ans[0]=node(Ans[0].lclr,tmp.lclr,Ans[0].sum+tmp.sum+(Ans[0].rclr==tmp.rclr));
	return Ans[0].sum+Ans[1].sum+(Ans[0].rclr==Ans[1].lclr);
}
int mian() {
	n=read(),m=read();
	for(int i=1;i<n;i++) {
		int u=read(),v=read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs1(1,0);
	seg[1]=rev[1]=top[1]=tot=1;
	dfs2(1,0);
	build(1,1,n);
	for(int i=1;i<=m;i++) {
		ll opt=read(),a=read(),b=read();
		if(opt==1) cover(a,b,i);
		else printf("%lld\n",ask(a,b));
	}
}
il void clean() {
	memset(dep,0,sizeof(dep));
	memset(fa,0,sizeof(fa));
	for(int i=1;i<=n;i++) g[i].clear();
	memset(rev,0,sizeof(rev));
	memset(seg,0,sizeof(seg));
	memset(siz,0,sizeof(siz));
	memset(son,0,sizeof(son));
	memset(top,0,sizeof(top));
	for(int i=1;i<=4*n;i++) {
		tr[i].l=tr[i].r=tr[i].lclr=tr[i].rclr=tr[i].sum=tr[i].tag=0;
	}
	tot=0;
}
ll _;
int main() {
	_=read();
	while(_--) {
		clean();
		mian();
	}
	return 0;
}

2024/2/25 19:36
加载中...