为什么去掉异或解码之后能够过掉普通peaks,这一题却WA 0?
查看原帖
为什么去掉异或解码之后能够过掉普通peaks,这一题却WA 0?
364254
njwsnjws楼主2022/7/21 21:04
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;

struct enode{
	int u,v,w;
	bool operator <(const enode&A){return w<A.w;};
};
struct vnode{
	int to,wei;
	vnode(int _t=0,int _w=0):to(_t),wei(_w){}
};

const int maxn=4e5+10,maxm=5e5+10,maxq=5e5+10,maxv=1e9+10;
int n,m,qn,nn=0;int h[maxn],val[maxn];
int id[maxn],sl[maxn],sr[maxn],tot=0;
int fa[maxn][25],mx[maxn][25];
enode e[maxm];vector<vnode> vec[maxn];

int f[maxn];
int find(int x){
	return f[x]=(f[x]==x?x:find(f[x]));
}

int a[maxn];bool rel[maxn];
struct tnode{
	int ls,rs,cnt;
}t[maxn*40];
int tid[maxn];int cntn=0;

void build(int &p,int old,int l,int r,int qx){
	p=++cntn;
	t[p]=t[old];t[p].cnt++;
	if(l==r)return;
	
	int mid=(l+r)>>1;
	if(qx<=mid)	build(t[p].ls,t[old].ls,l,mid,qx);
	else		build(t[p].rs,t[old].rs,mid+1,r,qx);
}
int query(int rid,int lid,int l,int r,int qk){
	int curs=t[rid].cnt-t[lid].cnt;
	if(curs<qk)return -1;
	
	if(l==r)return l;
	
	int mid=(l+r)>>1;
	int rc=t[t[rid].rs].cnt-t[t[lid].rs].cnt;
	if(qk<=rc)	return query(t[rid].rs,t[lid].rs,mid+1,r,qk);
	else		return query(t[rid].ls,t[lid].ls,l,mid,qk-rc);
}

void dfs(int x,int frm){
	id[x]=++tot,sl[x]=tot;
	fa[x][0]=frm;
	
	for(auto y:vec[x])if(y.to!=frm){
		val[y.to]=y.wei;
		dfs(y.to,x);
	}
	
	sr[x]=tot;
}

int main(){
	scanf("%d%d%d",&n,&m,&qn);
	for(int i=1; i<=n; i++)scanf("%d",&h[i]);
	for(int i=1; i<=m; i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	
	sort(e+1,e+m+1);nn=n;
	for(int i=1; i<=n; i++)f[i]=i;
	for(int i=1; i<=m; i++){
		int x=find(e[i].u),y=find(e[i].v);
		if(x==y)continue;
		
		nn++;
		f[x]=f[y]=f[nn]=nn;
		vec[nn].pb(vnode(x,e[i].w)),vec[nn].pb(vnode(y,e[i].w));
	}
	
	memset(val,0x7f,sizeof val);
	for(int i=1; i<=nn; i++)
		if(find(i)==i)dfs(i,0);//fa[][0],val,id,sl,sr
	
	for(int j=1; j<=20; j++)
		for(int i=1; i<=nn; i++)
			fa[i][j]=fa[fa[i][j-1]][j-1];
	
	memset(mx,0x7f,sizeof mx);
	for(int i=0; i<=nn; i++)mx[i][0]=val[i];
	for(int j=1; j<=20; j++)
		for(int i=1; i<=nn; i++)
			if(fa[i][j-1]<=nn)mx[i][j]=max(mx[i][j-1],mx[fa[i][j-1]][j-1]);
	
	for(int i=1; i<=n; i++)a[id[i]]=h[i],rel[id[i]]=true;	
	for(int i=n+1; i<=nn; i++)rel[id[i]]=false;
	for(int i=1; i<=tot; i++){
		if(rel[i])	build(tid[i],tid[i-1],1,maxv,a[i]);
		else		tid[i]=tid[i-1];
	}
	
	int lans=0;
	for(int i=1,v,x,k; i<=qn; i++){
		scanf("%d%d%d",&v,&x,&k);
		v=(v^lans)%n+1,x=x^lans,k=(k^lans)%n+1;
		for(int j=20; j>=0; j--)
			if(mx[v][j]<=x)v=fa[v][j];
		printf("%d\n",lans=query(tid[sr[v]],tid[sl[v]-1],1,maxv,k));
		if(lans==-1)lans=0;
	}

	return 0;
}

2022/7/21 21:04
加载中...