灵异事件(样例过)为啥去掉异或解码可过普通peaks,这一题却全WA?
查看原帖
灵异事件(样例过)为啥去掉异或解码可过普通peaks,这一题却全WA?
380019
xieyikai2333楼主2022/8/4 21:46

测试点都是line 1就错了,错的输出有的是-1有的是正数

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=5e5+5;
struct Segment_Tree
{
	int ls,rs,cnt;
}tree[N<<4];
struct edge
{
	int u,v,w;
	bool operator <(const edge &x)const
	{
		return this->w<x.w;
	}
}e[M];
int a[N>>1],t[N>>1],sz[N],id[N],L[N],R[N],from[N],f[N][25],lg[N],d[N],val[N],rt[N],n,len,tot=0,all=0;
vector<int> nodes[N];
void lsh()
{
	for(int i=1;i<=n;i++)t[i]=a[i];
	sort(t+1,t+n+1);
	len=unique(t+1,t+n+1)-t;
	for(int i=1;i<=n;i++)a[i]=lower_bound(t+1,t+len,a[i])-t;
	return;
}
void build(int &p,int l,int r)
{
	p=++tot;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(tree[p].ls,l,mid);
	build(tree[p].rs,mid+1,r);
	return;
}
int modify(int p,int l,int r,int x)
{
	int o=++tot;
	tree[o]=tree[p];
	tree[o].cnt++;
	if(l==r)return o;
	int mid=(l+r)>>1;
	if(x<=mid)tree[o].ls=modify(tree[o].ls,l,mid,x);
	else tree[o].rs=modify(tree[o].rs,mid+1,r,x);
	return o;
}
int query(int p1,int p2,int l,int r,int k)
{
	int delta=tree[tree[p2].rs].cnt-tree[tree[p1].rs].cnt;
	if(l==r)return l;
	int mid=(l+r)>>1;
	if(k<=delta)return query(tree[p1].rs,tree[p2].rs,mid+1,r,k);
	else return query(tree[p1].ls,tree[p2].ls,l,mid,k-delta);
}
int find(int x)
{
	if(x!=from[x])from[x]=find(from[x]);
	return from[x];
}
void dfs(int u,int fa)
{
	f[u][0]=fa,d[u]=d[fa]+1,L[u]=++all,id[all]=u;
	for(int v:nodes[u])dfs(v,u),sz[u]+=sz[v];
	R[u]=all;
	if(!sz[u])sz[u]=1;
	return;
}
int LCA(int u,int v)
{
	if(d[u]<d[v])swap(u,v);
	while(d[u]>d[v])u=f[u][lg[d[u]-d[v]]];
	if(u==v)return u;
	for(int i=lg[n];i>=0;i--)
	{
		if(f[u][i]!=f[v][i])
		{
			u=f[u][i];
			v=f[v][i];
		}
	}
	return f[u][0];
}
int main()
{
	int m,q,ans=0;
	scanf("%d %d %d",&n,&m,&q);
	int nn=n;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	lsh();
	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);
	for(int i=1;i<(n<<1);i++)from[i]=i;
	for(int i=1;i<=m;i++)
	{
		int ru=find(e[i].u),rv=find(e[i].v);
		if(ru!=rv)
		{
			from[ru]=from[rv]=++n;
			val[n]=e[i].w;
			nodes[n].push_back(ru);
			nodes[n].push_back(rv);
		}
	}
	for(int i=1;i<=n;i++)if(find(i)==i)dfs(i,0);
	for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
	for(int j=1;j<=lg[n];j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
	for(int i=1;i<=all;i++)
	{
	    if(id[i]<=nn)rt[i]=modify(rt[i-1],1,len,a[id[i]]);
        else rt[i]=rt[i-1];
	}
	while(q--)
	{
		int u,x,k;
		scanf("%d %d %d",&u,&x,&k);
		u=(u^ans)%n+1,x^=ans,k=(k^ans)%n+1;
		for(int i=21;i>=0;i--)if(f[u][i]&&val[f[u][i]]<=x)u=f[u][i];
	    if(sz[u]<k)ans=0,puts("-1");
		else printf("%d\n",ans=t[query(rt[L[u]-1],rt[R[u]],1,len,k)]);
	}
	return 0;
}
2022/8/4 21:46
加载中...