求助一个没用的时间戳
查看原帖
求助一个没用的时间戳
252664
Twig_K楼主2024/10/13 16:58

RT,和这个帖子里一样的问题。下面这份是过了的代码,只是在 76 行预处理 dfn 前把时间戳预先加了一,原本 WA on 36 就过了。

求助,不理解为什么。

#include<bits/stdc++.h>
#define mid (l+r>>1)
#define pb emplace_back
#define mk make_pair
#define For(i,il,ir) for(int i=(il);i<=(ir);++i)
#define Forr(i,ir,il) for(int i=(ir);i>=(il);--i)
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
template<typename T>
inline void read(T& x){
	bool f=0;x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){ if(ch=='-') f=1; ch=getchar(); }
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	if(f) x=-x;
}
template<typename T,typename... Args>
void read(T& first,Args&... args){ read(first),read(args...); }
const int maxn=1e6+10;
namespace O_O{
	int n,m,Q;
	int p[maxn];
	int fa[maxn],tot;
	vector<int> ve[maxn];
	int op[maxn],qx[maxn];
	int u[maxn],v[maxn];bool ban[maxn];
	int fd(int x){ while(x^fa[x]) x=fa[x]=fa[fa[x]]; return x; }
	void merge(int x,int y){
		x=fd(x),y=fd(y);
		if(x==y) return;
		fa[x]=fa[y]=++tot,fa[tot]=tot;
		ve[tot].pb(x),ve[tot].pb(y);
	}
	
	int sz[maxn];
	int dfn[maxn],w[maxn],timer;
	void dfs(int u,int fa){
		dfn[u]=++timer,sz[u]=1,w[timer]=u;
		for(int i=0;i<ve[u].size();++i) dfs(ve[u][i],u),sz[u]+=sz[ve[u][i]];
	}
	
	pii tr[maxn<<2];
	void build(int o,int l,int r){
		if(l==r){ tr[o]=mk(p[w[l]],w[l]); return; }
		build(o<<1,l,mid),build(o<<1|1,mid+1,r);
		tr[o]=max(tr[o<<1],tr[o<<1|1]);
	}
	pii query(int o,int l,int r,int qx,int qy){
		if(qx<=l&&r<=qy) return tr[o];
		if(qx>mid) return query(o<<1|1,mid+1,r,qx,qy);
		if(qy<=mid) return query(o<<1,l,mid,qx,qy);
		return max(query(o<<1,l,mid,qx,qy),query(o<<1|1,mid+1,r,qx,qy));
	}
	void update(int o,int l,int r,int pos){
		if(l==r){ tr[o]=mk(0,0); return; }
		if(pos<=mid) update(o<<1,l,mid,pos);
		else update(o<<1|1,mid+1,r,pos);
		tr[o]=max(tr[o<<1],tr[o<<1|1]);
	}
	signed my_main()
	{
		read(n,m,Q),tot=n;
		For(i,1,n) read(p[i]),fa[i]=i;
		For(i,1,m) read(u[i],v[i]);
		For(i,1,Q){
			read(op[i],qx[i]);
			if(op[i]==2) ban[qx[i]]=1;
		}
		For(i,1,m) if(!ban[i]) merge(u[i],v[i]);
		Forr(i,Q,1){
			if(op[i]==1) qx[i]=fd(qx[i]);
			else merge(u[qx[i]],v[qx[i]]);
		}
		++timer;
		For(i,1,tot) if(fa[i]==i) dfs(i,0);
		build(1,1,timer);
		For(i,1,Q) if(op[i]==1){
			int ll=dfn[qx[i]],rr=dfn[qx[i]]+sz[qx[i]]-1;
			pii ans=query(1,1,timer,ll,rr);
			printf("%d\n",ans.fi);
			update(1,1,timer,dfn[ans.se]);
		}
		return 0;
	}
}
signed main(){ return O_O::my_main(); }
2024/10/13 16:58
加载中...