社区讨论
TLE on #14 569ms/19.99MB 求调
P5064[Ynoi Easy Round 2014] 等这场战争结束之后参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjavt97
- 此快照首次捕获于
- 2025/11/03 23:34 4 个月前
- 此快照最后确认于
- 2025/11/03 23:34 4 个月前
拼尽全力卡不过去,rt,玄关。
CPP#include<bits/stdc++.h>
#define getchar getchar_unlocked
#define putchar putchar_unlocked
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
template<typename Tp> Tp read() {
Tp x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
}
template<typename Tp> void write(Tp x) {
if(x<0) {putchar('-');x=-x;}
static int sta[45];int top=0;
do {sta[top++]=x%10;x/=10;} while(x);
while(top) putchar(sta[--top]+'0');
}
constexpr int N=1e5+5;
int n,m,block=4970,k,a[N],ord[N],num[N],vtx[N],buc[N][22],ans[N];
inline int st(int x) {
return (x-1)*block+1;
}
inline int ed(int x) {
return x*block;
}
inline int bel(int x) {
return (x-1)/block+1;
}
int fa[N],siz[N];
inline int find(int x) {
while (x != fa[x]) x = fa[x];
return x;
}
struct Option {
int op,x,y;
} b[N];
struct enode {
int nxt,to;
} edge[N];
int tot,head[N];
void add(int u,int v) {
edge[++tot]={head[u],v};
head[u]=tot;
}
void lsh() {
sort(ord+1,ord+n+1);
for(int i=1;i<=n;i++) {
a[i]=lower_bound(ord+1,ord+n+1,a[i])-ord;
a[i]+=num[a[i]]++;
vtx[a[i]]=i;
}
}
void dfs(int u) {
int op=b[u].op,x=b[u].x,y=b[u].y,fx=0,fy=0;
if(op!=2) fx=find(x);
if(op==1) {
fy=find(y);
if(fx!=fy) {
if(siz[fx]>siz[fy]) swap(fx,fy);
fa[fx]=fy,siz[fy]+=siz[fx];
for(int i=1;i<=k;i++) buc[fy][i]+=buc[fx][i];
}
}
else if(op==3) {
if(siz[fx]<y) ans[u]=-1;
else {
for(int i=1;i<=k;i++) {
if(y<=buc[fx][i]) {
int L=st(i),R=ed(i);
for(int j=L;j<=R;j++) {
int node_id=vtx[j];
int root=find(node_id);
if(root==fx) {
if(--y==0) {
ans[u]=ord[j];
break;
}
}
}
break;
}
y-=buc[fx][i];
}
}
}
for(int i=head[u];i;i=edge[i].nxt) {
int v=edge[i].to;
dfs(v);
}
if(op==1) {
if(fx!=fy) {
fa[fx]=fx,siz[fy]-=siz[fx];
for(int i=1;i<=k;i++) buc[fy][i]-=buc[fx][i];
}
}
}
int main() {
n=read<int>(),m=read<int>();
for(int i=1;i<=n;i++) ord[i]=a[i]=read<int>();
lsh();
k=n/block+(n%block>0);
for(int i=1;i<=m;i++) {
b[i].op=read<int>(),b[i].x=read<int>();
if(b[i].op==2) add(b[i].x,i);
else {
b[i].y=read<int>();
add(i-1,i);
}
}
for(int i=1;i<=n;i++) {
fa[i]=i,siz[i]=1;
buc[i][bel(a[i])]=1;
}
dfs(0);
for(int i=1;i<=m;i++)
if(b[i].op==3) {
write(ans[i]);putchar('\n');
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...