社区讨论
萌新求助,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 条回复,欢迎继续交流。
正在加载回复...