求助 第个7点WA掉了
查看原帖
求助 第个7点WA掉了
111081
Mistletoes楼主2021/1/23 11:48

在CF上交,第7个点是RE

在洛谷上交,第7个点WA。。。

/*将每条边删去的时间戳记为这条边的权值,
如果将边权从大到小(即在时间上从后往前)建起Kruskal重构树的话,
每个子树都代表着一个时间点上的联通块*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5e5+5;
struct Edge{
	int v,nxt;
}edge[N];
struct Data{
	int u,v,w;
}e[300005];
struct Que{
	int tp,x;
}que[500005];
int fa[N];
bool vis[N];
int cnt,head[N],tot,val[N],dfn[N],ind,rnd[N],sz[N],dep[N],f[N][22];
struct Seg{
	int maxn,node;
}t[N*4];
int n,m,q,p[200005];
bool cmp(Data a,Data b){
	return a.w>b.w;
}
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void add(int u,int v){
	edge[++cnt].v=v;
	edge[cnt].nxt=head[u];
	head[u]=cnt;
}
void dfs(int u){
	dfn[u]=++ind;
	rnd[ind]=u;
	sz[u]=1;
	vis[u]=1;
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].v;
		if(vis[v]) continue;
		f[v][0]=u;
		dep[v]=dep[u]+1;
		dfs(v);
		sz[u]+=sz[v];
	}
}
int jump(int x,int idx){
	for(int i=19;i>=0;i--)
		if(val[f[x][i]]>idx) x=f[x][i];
	return x;
}
void build(int u,int l,int r){
	if(l==r){
		t[u].maxn=p[rnd[l]];
		t[u].node=rnd[l];
		return;
	}
	int mid=(l+r)/2;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	if(t[u<<1].maxn<t[u<<1|1].maxn) t[u]=t[u<<1|1];
	else t[u]=t[u<<1];
}
void update(int u,int l,int r,int x){
	if(l==r){
		t[u].maxn=0;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid) update(u<<1,l,mid,x);
	else update(u<<1|1,mid+1,r,x);
	if(t[u<<1].maxn<t[u<<1|1].maxn) t[u]=t[u<<1|1];
	else t[u]=t[u<<1];
}
Seg query(int u,int l,int r,int a,int b){
	if(a<=l&&r<=b) return t[u];
	int mid=(l+r)/2;
	Seg ret1,ret2;
	ret1.maxn=0;ret1.node=0;
	ret2.maxn=0;ret2.node=0;
	if(a<=mid) ret1=query(u<<1,l,mid,a,b);
	if(mid<b) ret2=query(u<<1|1,mid+1,r,a,b);
	if(ret1.maxn<=ret2.maxn) return ret2;
	else return ret1;
}
int main(){
	scanf("%d%d%d",&n,&m,&q);tot=n;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=n;i++) scanf("%d",&p[i]);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&e[i].u,&e[i].v);
		e[i].w=q+1;
	}
	for(int i=1;i<=q;i++){
		scanf("%d%d",&que[i].tp,&que[i].x);
		if(que[i].tp==2) e[que[i].x].w=i;
	}
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=n;i++) val[i]=q+1;
	for(int i=1;i<=m;i++){
		int fu=find(e[i].u),fv=find(e[i].v);
		if(fu!=fv){
			tot++;fa[tot]=tot;
			val[tot]=e[i].w;
			add(tot,fu);
			add(tot,fv);
			fa[fu]=tot;fa[fv]=tot;
		}
	}
	for(int i=1;i<=tot;i++)
		if(find(i)==i) dfs(i);//不要用if(!vis[i]),是find(i)非fa[i] 
	for(int j=1;j<=19;j++){//j套外层 
		for(int i=1;i<=tot;i++){
			//if(dep[i]<(1<<j)) continue;(可不写)
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	build(1,1,tot);
	for(int i=1;i<=q;i++){
		if(que[i].tp==1){
			int u=jump(que[i].x,i);
			Seg ans=query(1,1,tot,dfn[u],dfn[u]+sz[u]-1);
			if(ans.node) update(1,1,tot,dfn[ans.node]);
			printf("%d\n",ans.maxn);
		}
	}
	return 0;
}
2021/1/23 11:48
加载中...