小鬼求助
  • 板块灌水区
  • 楼主zmx_wzx_JY
  • 当前回复13
  • 已保存回复13
  • 发布时间2021/7/28 20:32
  • 上次更新2023/11/4 12:49:38
查看原帖
小鬼求助
86579
zmx_wzx_JY楼主2021/7/28 20:32

这个鬼玩意儿为什么会 CE 啊。

没有 Linux 虚拟机的我非常费解。

//stO zzh!!!
#include<bits/stdc++.h>
#define LL long long
#define Rep(i,x,y) for(int i = (x), stOxrj = (y); i<=stOxrj; ++i)
#define Irep(i,x,y) for(int i = (x), stOxrj = (y); i>=stOxrj; --i)
#define VEC vector<int>
#define IT iterator
#define pb push_back
#define il inline
#define ci const int&
#define fi first
#define se second
#define mp make_pair
#define PA pair<int, int>
using namespace std;
inline int read(){
    int res = 0, flag = 1; char c = getchar();
    while( c<'0' || c>'9' ) { if( c=='-' ) flag = -1; c = getchar(); }
    while( c>='0' && c<='9' ) res = res * 10 + c - '0', c = getchar();
    return res * flag;
}
const int N = 1e5 + 20, M = 4e5 + 20;
int n;
struct SEG{
	#define ls rt<<1
	#define rs rt<<1|1
	#define mid (l + r >> 1)
	LL sum[M]; int tag[M];
	void Init(){ memset(tag, -1, sizeof(tag)); memset(sum, 0, sizeof(sum) ); }
	void orz(int rt,int l,int r,int v){
		sum[rt] = 1ll * v * (r - l + 1); tag[rt] = v; 
	}
	void pd(int rt,int l,int r){
		if( tag[rt]==-1 ) return ;
		orz(ls, l, mid, tag[rt]), orz(rs, mid + 1, r, tag[rt]);
		tag[rt] = -1;
	}
	void modif(int rt,int l,int r,int lef,int rig,int v){
		if( lef<=l && r<=rig ) return orz(rt, l, r, v);
		pd(rt, l, r);
		if( lef<=mid ) modif(ls, l, mid, lef, rig, v);
		if( rig>mid ) modif(rs, mid + 1, r, lef, rig, v);
		sum[rt] = sum[ls] + sum[rs]; 
	}
	LL quer(int rt,int l,int r,int lef,int rig){
		if( lef<=l && r<=rig ) return sum[rt];
		pd(rt, l, r); int res = 0;
		if( lef<=mid )  res = quer(ls, l, mid, lef, rig);
		if( rig>mid ) res += quer(rs, mid + 1, r, lef, rig); 
		return res; 
	}
	void M(int l,int r,int v){
		if( 1<=l && l<=r && r<=n ) modif(1, 1, n, l, r, v);
	}
	LL Q(int l,int r){
		if( 1<=l && l<=r && r<=n ) return quer(1, 1, n, l, r);
		return 0;
	}
}T1, T2; 
VEC e[N]; void add(int u,int v){ e[u].pb(v); }
int dfn[N],fa[N],dep[N],top[N],sz[N],son[N],dtime; 
void dfs1(int u,int fat){
	sz[u] = 1; fa[u] = fat; dep[u] = dep[fat] + 1;
	for(auto v:e[u]) if( v!=fat ){
		dfs1(v, u); sz[u] += sz[v];
		if( sz[v]>sz[son[u]] ) son[u] = v; 
	}
}
void dfs2(int u,int x){
	dfn[u] = ++dtime;
	top[u] = x;
	if( son[u] ) dfs2(son[u], x);
	for(auto v:e[u]) if( v!=son[u] && v!=fa[u] ) dfs2(v, v);
}
int ti[N];
void upd(int u,int v,int tim){
	int fu = top[u], fv = top[v];
	while( fu!=fv ){
		if( dep[fu]<dep[fv] ) swap(fu, fv), swap(u, v);
		T1.M(dfn[son[u]], dfn[son[u]], 0); 
		T1.M(dfn[fu], dfn[u], 1);
		T2.M(dfn[fu], dfn[u], tim); ti[fu] = tim; 
		u = fa[fu]; fu = top[u];
	}
	if( dep[u]<dep[v] ) swap(u, v);
	T1.M(dfn[son[u]], dfn[son[u]], 0);
	T1.M(dfn[son[v]], dfn[u], 1);
	if( top[v]!=v ) T1.M(dfn[v], dfn[v], 0);
	T2.M(dfn[v], dfn[u], tim);
}
int ask(int u,int v){
	int fu = top[u], fv = top[v], res = 0;
	while( fu!=fv ){
		if( dep[fu]<dep[fv] ) swap(u, v), swap(fu, fv);
		res += T1.Q(dfn[son[fu]], dfn[u]);
		if( T2.Q(dfn[fa[fu]], dfn[fa[fu]]) <= ti[fu]) 
			if( T2.Q(dfn[fu], dfn[fu]) <= ti[fu] ) res++;
		u = fa[fu]; fu = top[u];
	}
	if( dep[u]<dep[v] ) swap(u, v);
	res += T1.Q(dfn[son[v]], dfn[u]);
	return res;
}

void Solve(){
	T1.Init(); T2.Init();
	n = read(); int T = read();
	Rep(i,0,n+2) e[i].clear(), dfn[i] = fa[i] = dep[i] = top[i] = sz[i] = son[i] = 0, ti[i] = -1;
	dtime = 0;
	Rep(i,1,n-1){
		int u = read(), v = read();
		add(u, v), add(v, u); 
	}
	dfs1(1, 0), dfs2(1, 1);
	Rep(i,1,T){
		int op = read(), u = read(), v = read();
		if( op==1 ) upd(u, v, i);
		else printf("%d\n", ask(u, v) );
	}
}
signed main(){
	freopen("edge.in", "r", stdin);
	freopen("edge.out", "w", stdout);
	int T = read();
	while( T-- ) Solve();
	return 0; 
}
2021/7/28 20:32
加载中...