数据太水
查看原帖
数据太水
119261
7KByte楼主2020/9/30 12:26

Rt,O(N2)\rm O(N^2)艹过去了,没用任何数据结构/kel。

求Hack

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 100005
using namespace std;
int n,q,h[N],tot,v[N],f[N],fa[N],g[N],sz[N];char s[2];
struct node{bool op;int x,y;}a[N];
struct edge{int to,nxt;}e[N<<1];
void adde(int x,int y){e[++tot].nxt=h[x];h[x]=tot;e[tot].to=y;}
void dfs(int x){
	v[x]=1;
	for(int i=h[x];i;i=e[i].nxt)
		if(e[i].to!=f[x])f[e[i].to]=x,dfs(e[i].to);
}
int get(int x){return g[x]==x?x:g[x]=get(g[x]);}
void add(int x,int val){
	while(x)sz[x]+=val,x=fa[x];
}
int main(){
	scanf("%d%d",&n,&q);
	rep(i,1,q){
		scanf("%s%d%d",s,&a[i].x,&a[i].y);
		if(*s=='A')a[i].op=0,adde(a[i].x,a[i].y),adde(a[i].y,a[i].x);
		else a[i].op=1;
	}
	rep(i,1,n){sz[i]=1;g[i]=i;if(!v[i])dfs(i);}
	rep(i,1,q){
		if(a[i].op){
			if(fa[a[i].x]==a[i].y)printf("%d\n",sz[a[i].x]*(sz[get(a[i].y)]-sz[a[i].x]));
			else printf("%d\n",sz[a[i].y]*(sz[get(a[i].x)]-sz[a[i].y]));
		}
		else{
			if(f[a[i].x]==a[i].y)fa[a[i].x]=a[i].y,g[a[i].x]=g[a[i].y],add(a[i].y,sz[a[i].x]);
			else fa[a[i].y]=a[i].x,g[a[i].y]=g[a[i].x],add(a[i].x,sz[a[i].y]);
		}
	}
	return 0;
}
2020/9/30 12:26
加载中...