3 条题解

  • 3
    @ 2022-12-27 15:07:11

    #include<bits/stdc++.h> #define debug(...) fprintf(stderr,VA_ARGS) #define DEBUG printf("Passing [%s] in LINE %d\n",FUNCTION,LINE) #define Debug debug("Passing [%s] in LINE %d\n",FUNCTION,LINE) #define all(x) x.begin(),x.end() #define x first #define y second using namespace std; const double eps=1e-8; const double pi=acos(-1.0); typedef long long ll; typedef pair<int,int> pii; template<class T>int chkmin(T &a,T b){return a>b?a=b,1:0;} template<class T>int chkmax(T &a,T b){return a<b?a=b,1:0;} template<class T>T sqr(T a){return aa;} template<class T>T mmin(T a,T b){return a<b?a:b;} template<class T>T mmax(T a,T b){return a>b?a:b;} template<class T>T aabs(T a){return a<0?-a:a;} template<int a>int cmp_a(int x,int y){return a[x]<a[y];} #define min mmin #define max mmax #define abs aabs int read(){ int s=0,base=1; char c; while(!isdigit(c=getchar()))if(c=='-')base=-base; while(isdigit(c)){s=s10+(c^48);c=getchar();} return sbase; } bool cx[1048575]; int mn[1048575],mx[1048575]; template<const function<int(int,int)> &cmp> struct MQ{ int s[1048575],*l,*r; MQ(){l=s+1;r=s;} void add(int x){ while(l<=r && cmp(x,*r))--r; *(++r)=x; } void del(int x){ if(*lx)++l; } int top(){return *l;} }; int increase(int a,int b){return a<b;} int decrease(int a,int b){return a>b;} function<int(int,int)> Inc=increase; function<int(int,int)> Dec=decrease; MQ<Inc> inc; MQ<Dec> dec_; int main(){ #ifdef cnyali_lk freopen("2698.in","r",stdin); freopen("2698.out","w",stdout); #endif int n,d,x,y,l,r,xmn=0x3f3f3f3f; n=read();d=read(); for(int i=0;i<=1000000;++i)mn[i]=0x3f3f3f3f,mx[i]=-0x3f3f3f3f; for(int i=1;i<=n;++i){ x=read();y=read(); chkmax(mx[x],y); chkmin(mn[x],y); cx[x]=1; chkmin(xmn,x); } l=xmn,r=xmn; inc.add(mn[l]); dec_.add(mx[l]); int ans=0x3f3f3f3f; n=1000000; while(r<=n){ while(r<=n && dec_.top()-inc.top()<d){++r;if(cx[r]){inc.add(mn[r]);dec_.add(mx[r]);}} while(l<r && dec_.top()-inc.top()>=d){if(cx[l]){inc.del(mn[l]);dec_.del(mx[l]);}++l;} if(r<=n) chkmin(ans,r-l+1); } if(ans0x3f3f3f3f)printf("-1\n"); else printf("%d\n",ans); return 0; }

    • @ 2022-12-27 15:08:37

      对不起,我不知道怎么是题解的代码不在一行

    • @ 2022-12-27 15:09:11

      我为自己扣一分,呵呵。

  • 2
    #include<bits/stdc++.h>
    using namespace std;
    void read(int &x){//快读 
    	int f=1;x=0;
    	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();}
    	x*=f;
    }
    #define N 100010
    int n,d,ans;
    struct node{
    	int x,y;
    }a[N];
    bool cmp(node aa,node bb){
    	return aa.x<bb.x;
    }
    int p1[N],p2[N];//我写单调队列一般用 q[] 存具体值,用 p[]存位置 
    int head1,head2,tail1,tail2;//队列 1存最大值,队列 2存最小值 
    int main(){
    	read(n),read(d);//如题所示 
    	for(int i=1;i<=n;i++){
    		read(a[i].x),read(a[i].y);//结构体,因为要排序 
    	}
    	sort(a+1,a+1+n,cmp);//排序 
    	ans=0x3f3f3f3f;
    	head1=head2=1;
    	for(int le=0,r=0;le<=n;le++){//最外层循环拉左端点 
    		while(head1<=tail1&&p1[head1]<le) head1++;//如果队首比左端点小,那么右移
    		while(head2<=tail2&&p2[head2]<le) head2++;//因为排序过了,编号小x一定小 
    		while(a[p1[head1]].y-a[p2[head2]].y< d && r<n){
    			r++;
    			while(head1<=tail1&&a[p1[tail1]].y<a[r].y) tail1--;
    			p1[++tail1]=r;
    			while(head2<=tail2&&a[p2[tail2]].y>a[r].y) tail2--;
    			p2[++tail2]=r;//更新两个单调队列 
    		}
    		if(r!=n) ans=min(ans,a[r].x-a[le].x);//满足条件 
    	} 
    	if(ans>=0x3f3f3f3f){//判无解 
    		printf("-1");return 0;
    	}
    	else{
    		printf("%d",ans);
    	}
    }
    
    
    • 1
      @ 2023-10-5 20:16:51

      没没没没没没没没没没没数据啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

      • 1

      信息

      ID
      1848
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      58
      已通过
      0
      上传者