50pts 最后10个点TLE 悬关
查看原帖
50pts 最后10个点TLE 悬关
575363
revolutionary_oier楼主2024/10/22 09:41
#include<bits/stdc++.h>
using namespace std;

const int maxn=4e5+10;
const int inf=2e9;
int T,n,m,cnt,idx,c;
int siz[maxn],son[maxn],fa[maxn],dfn[maxn],dep[maxn],top[maxn],head[maxn];
struct node{
	int v,nxt;
}e[maxn<<1];
struct vertex{
	int l,r;
	int le,re;
	int sum,lazy;
}t[maxn<<2];
inline void add(int u,int v){
	e[++cnt].v=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
		s=s*10+ch-'0';
		ch=getchar();
	}
    return s*w;
}
inline void ipt(){
	cnt=idx=c=0;
	n=read(),m=read();
	for(register int i=1;i<=n;i++)head[i]=0;
	for(register int i=1;i<n;i++){
		int u,v;
		u=read(),v=read();
		add(u,v);
		add(v,u);
	}
}
inline void dfs1(int u){
	son[u]=0;
	siz[u]=1;
	for(register 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;
		dfs1(v);
		siz[v]+=siz[u];
		if(siz[v]>siz[son[u]])son[u]=v;
	}
}
inline void dfs2(int u,int rt){
	++idx;
	dfn[u]=idx;
	top[u]=rt;
	if(son[u]!=0)dfs2(son[u],rt);
	for(register int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==fa[u]||v==son[u])continue;
		dfs2(v,v);
	}
}
inline void upd(int i){
	t[i].sum=t[i<<1].sum+t[i<<1|1].sum;
	if(t[i<<1].re==t[i<<1|1].le)t[i].sum++;
	t[i].le=t[i<<1].le;
	t[i].re=t[i<<1|1].re;
}
inline void build(int i,int l,int r){
	t[i].l=l,t[i].r=r,t[i].lazy=-1;
	if(l==r){
		t[i].le=t[i].re=++c;
		t[i].sum=0;
		return ;
	}
	int mid=l+r>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	upd(i);
}
inline void pushdown(int i){
	if(t[i].lazy!=-1){
		t[i<<1].sum=t[i<<1].r-t[i<<1].l;
		t[i<<1].lazy=t[i].lazy;
		t[i<<1].le=t[i].lazy;
		t[i<<1].re=t[i].lazy;
		
		t[i<<1|1].sum=t[i<<1|1].r-t[i<<1|1].l;
		t[i<<1|1].lazy=t[i].lazy;
		t[i<<1|1].le=t[i].lazy;
		t[i<<1|1].re=t[i].lazy;
		
		t[i].lazy=-1;
	}
	return ;
}
inline void change(int i,int l,int r,int x){
	if(t[i].l>r||t[i].r<l)return ;
	if(l<=t[i].l&&t[i].r<=r){
		t[i].sum=t[i].r-t[i].l;
		t[i].lazy=x;
		t[i].le=t[i].re=x;
		return ;
	}
	pushdown(i);
	change(i<<1,l,r,x);
	change(i<<1|1,l,r,x);
	upd(i);
}
inline vertex query(int i,int l,int r){
	vertex nx,ny,x;
	x.le=x.re=x.sum=x.lazy=inf;
	if(t[i].l>r||t[i].r<l)return x;
	if(l<=t[i].l&&t[i].r<=r)return t[i];
    pushdown(i);
    nx=query(i<<1,l,r);
    ny=query(i<<1|1,l,r);
    if(nx.le==inf){
        if(ny.le==inf)return x;
        return ny;
    }
    else {
        if(ny.le==inf)return nx;
        x.le=nx.le,x.re=ny.re;
        x.sum=nx.sum+ny.sum;
        if(nx.re==ny.le)x.sum++;
        return x;
    }
}
inline void change1(int x,int y,int w){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		change(1,dfn[top[x]],dfn[x],w);
		x=fa[top[x]]; 
	}
	if(dep[x]<dep[y])swap(x,y);
	change(1,dfn[y],dfn[x],w);
}
inline int query1(int x,int y){
	int res=0;
	vertex nx,ny;
	nx.le=nx.re=nx.sum=ny.le=ny.re=ny.sum=inf;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y),swap(nx,ny);
		vertex p=query(1,dfn[top[x]],dfn[x]);
		res+=p.sum;
		if(nx.le!=inf)
			if(nx.le==p.re)res++;
		x=fa[top[x]];
		nx=p;
	}
	if(dep[x]<dep[y])swap(x,y),swap(nx,ny);
	vertex p=query(1,dfn[y],dfn[x]);
	res+=p.sum;
	if(nx.le!=inf)
		if(nx.le==p.re)res++;
	if(ny.le!=inf)
		if(ny.le==p.le)res++;
	return res;
}
inline void solve(){
	while(m--){
		int op,x,y;
		op=read(),x=read(),y=read();
		if(op==1)change1(x,y,++c);
		else printf("%d\n",query1(x,y));
	}
}
signed main(){
//	freopen("P7735.in","r",stdin);
//	freopen("P7735.out","w",stdout);
//	printf("I\n");
	T=read();
	printf("T = %lld\n",T);
	for(int i=1;i<=T;i++){
		ipt();
		dfs1(1);
		dfs2(1,1);
		build(1,1,n);
		solve();
	}
	return 0;
}

尝试下载了数据 结果文件啥也没输出

2024/10/22 09:41
加载中...