社区讨论

蒟蒻求助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 条回复,欢迎继续交流。

正在加载回复...