社区讨论
蒟蒻求助qwq
题目总版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo14erkj
- 此快照首次捕获于
- 2023/10/22 15:01 2 年前
- 此快照最后确认于
- 2023/11/02 14:33 2 年前
本蒟蒻的代码,WA+MLE 不知错哪里:
CPP#include<bits/stdc++.h>
#include<queue>
using namespace std;
const int N=100005;
int n,c,s1,s2;
int fa[N],siz[N];
struct cow{
int X,Y,id;
}a[N];
queue <int> Q;
bool cmp(cow x,cow y){
return x.X<y.X;
}
void Clean(){
for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;
}
int Find(int x){
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
void United(int x,int y){
int f1=Find(x),f2=Find(y);
if(f1==f2) return;
fa[f1]=f2;siz[f2]+=siz[f1];
}
struct FHQ_Treap{
int ls,rs,key,prio,siz;
int Id;
}t[N];
int root,tot;
int Newnode(int x,int id){
t[++tot].ls=t[tot].rs=0;
t[tot].key=x;t[tot].Id=id;
t[tot].siz=1;t[tot].prio=rand();
return tot;
}
void Pushup(int x){
t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+1;
}
void Split(int u,int x,int &l,int &r){
if(u==0){
l=r=0;return;
}
if(t[u].key<=x)
l=u,Split(t[u].rs,x,t[u].rs,r);
else r=u,Split(t[u].ls,x,l,t[u].ls);
Pushup(u);
}
int Merge(int l,int r){
if(l==0||r==0) return l+r;
if(t[l].prio>t[r].prio){
t[l].rs=Merge(t[l].rs,r);
Pushup(l);return l;
}else{
t[r].ls=Merge(l,t[r].ls);
Pushup(r);return r;
}
}
void Insert(int x,int id){
int l,r;
Split(root,x,l,r);
root=Merge(l,Merge(Newnode(x,id),r));
}
void Delete(int x){
int l,r,p;
Split(root,x,l,r);
Split(l,x-1,l,p);
root=Merge(l,Merge(Merge(t[p].ls,t[p].rs),r));
}
int Kth(int u,int k){
if(t[t[u].ls].siz+1==k) return u;
else if(t[t[u].ls].siz>=k) return Kth(t[u].ls,k);
else return Kth(t[u].rs,k-t[t[u].ls].siz-1);
}
pair<int,int> Get(int x,int op){
int l,r,res,p;
Split(root,x,l,r);
Split(l,x-1,l,p);
if(t[p].siz>0) res=p;
else res=(op==0?Kth(l,t[l].siz):Kth(r,1));
root=Merge(l,Merge(p,r));
return make_pair(t[res].Id,t[res].key);
}
int main(){
// freopen("P2906_2.in","r",stdin);
// freopen("P2906_my.out","w",stdout);
srand(time(NULL));
scanf("%d%d",&n,&c);
Clean();
Insert(-(1<<28),0);Insert((1<<28),0);
for(int i=1;i<=n;i++){
scanf("%d%d",&s1,&s2);
a[i].X=s1+s2;a[i].Y=s1-s2;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
int head=1;
for(int i=1;i<=n;i++){
while(head<i&&a[i].X-a[head].X>c){
Delete(a[head++].Y);
}
pair<int,int> pre=Get(a[i].Y,0),nex=Get(a[i].Y,1);
// printf("pre=(%d,%d)\n",pre.first,pre.second);
// printf("next=(%d,%d)\n",nex.first,nex.second);
if(abs(a[i].Y-pre.second)<=c){
United(a[i].id,pre.first);
}
if(abs(a[i].Y-nex.second)<=c){
United(a[i].id,nex.first);
}
Insert(a[i].Y,a[i].id);
}
int ans=0,maxsize=0;
for(int i=1;i<=n;i++) if(Find(i)==i) ans++,maxsize=max(maxsize,siz[i]);
printf("%d %d\n",ans,maxsize);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...