社区讨论

萌新求助,AC代码开了O2就全部RE了,想知道是什么原因。

P7834[ONTAK2010] Peaks 加强版参与者 7已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lo7xap7f
此快照首次捕获于
2023/10/27 09:16
2 年前
此快照最后确认于
2023/10/27 09:16
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define QwQ puts("QwQ")
using namespace std;
const int N=200005,M=500005;
int n,m,q,cnt,tot,num,total,lastans,a[N],fa[N][20],sz[N],f[N],val[N],vis[N],b[N],lsh[N],ls[N],rs[N],root[N*40],le[N*40],ri[N*40],sum[N*40];
struct node
{
	int u,v,w;
}edge[M];
vector<int>e[N];
bool cmp(node a,node b)
{
	return a.w<b.w;
}
int find(int x)
{
	return f[x]==x?x:f[x]=find(f[x]);
}
int update(int last,int &now,int l,int r,int x)
{
	now=++tot;
	sum[now]=sum[last]+1;
	if(l==r) return now;
	int mid=l+r>>1;
	if(x<=mid)
	{
		ri[now]=ri[last];
		le[now]=update(le[last],le[now],l,mid,x);
	}
	else
	{
		le[now]=le[last];
		ri[now]=update(ri[last],ri[now],mid+1,r,x);
	}
	return now;
}
void dfs(int u)
{
	for(int j=1;(1<<j)<=n;j++)
	{
		fa[u][j]=fa[fa[u][j-1]][j-1];
	}
	ls[u]=++num;
	if(u<=n) update(root[num-1],root[num],1,total,a[u]);
	else root[num]=root[num-1];
	for(int j=0;j<e[u].size();j++)
	{
		int v=e[u][j];
		if(ls[v]) continue;
		dfs(v);
	}
	rs[u]=num;
	return;
}
int query_kth(int x,int y,int l,int r,int k)
{
	if(l==r) return l;
	int mid=l+r>>1,all=sum[ri[y]]-sum[ri[x]];
	if(k>all) return query_kth(le[x],le[y],l,mid,k-all);
	else return query_kth(ri[x],ri[y],mid+1,r,k);
}
int query(int u,int x,int k)
{
	int ll=ls[u],rr=rs[u];
	int ans=query_kth(root[ll-1],root[rr],1,total,k);
	return b[ans];
}
int main()
{
	cin>>n>>m>>q;
	cnt=n;
	for(int i=1;i<=n;i++)
	{
		cin>>b[i];
		lsh[i]=b[i];
	}
	sort(b+1,b+n+1);
	total=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++)
	{
		a[i]=lower_bound(b+1,b+total+1,lsh[i])-b;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>edge[i].u>>edge[i].v>>edge[i].w;
		f[i]=i;
	}
	sort(edge+1,edge+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		int u=find(edge[i].u),v=find(edge[i].v),w=edge[i].w;
		if(u!=v)
		{
			cnt++;
			val[cnt]=w;
			f[u]=f[v]=f[cnt]=cnt;
			fa[u][0]=cnt;
			fa[v][0]=cnt;
			e[cnt].push_back(u);
			e[cnt].push_back(v);
			if(cnt==2*n-1) break;
		}
	}
	for(int i=1;i<=cnt;i++)
	{
		if(!ls[i]) dfs(find(i));
	}
	while(q--)
	{
		int u,x,k;
		cin>>u>>x>>k;
		u=(u^lastans)%n+1;
		k=(k^lastans)%n+1;
		x=x^lastans;
        for(int j=18;j>=0;j--)
	    {
		    if(fa[u][j]&&val[fa[u][j]]<=x) u=fa[u][j];
	    }
		if(sum[root[rs[u]]]-sum[root[ls[u]-1]]<k)
		{
			cout<<-1<<endl;
			lastans=0;
			continue;
		}
		cout<<(lastans=query(u,x,k))<<endl;
	}
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...