双指针二分做法求卡常
查看原帖
双指针二分做法求卡常
124740
ethan_zhou楼主2021/4/19 11:44

rt,目前最后一个点大概 1.15s

#include<bits/stdc++.h>
using namespace std;
const int MXN=2e6+5;
const int INF=1e9;
int n,m;
int a[MXN],b[MXN],suf[MXN];
bool vis[MXN];

namespace nqio{const unsigned R=4e5,W=4e5;char*a,*b,i[R],o[W],*c=o,*d=o+W,h[40],*p=h,y;bool s;struct q{void r(char&x){x=a==b&&(b=(a=i)+fread(i,1,R,stdin),a==b)?-1:*a++;}void f(){fwrite(o,1,c-o,stdout);c=o;}~q(){f();}void w(char x){*c=x;if(++c==d)f();}q&operator>>(char&x){do r(x);while(x<=32);return*this;}q&operator>>(char*x){do r(*x);while(*x<=32);while(*x>32)r(*++x);*x=0;return*this;}template<typename t>q&operator>>(t&x){for(r(y),s=0;!isdigit(y);r(y))s|=y==45;if(s)for(x=0;isdigit(y);r(y))x=x*10-(y^48);else for(x=0;isdigit(y);r(y))x=x*10+(y^48);return*this;}q&operator<<(char x){w(x);return*this;}q&operator<<(char*x){while(*x)w(*x++);return*this;}q&operator<<(const char*x){while(*x)w(*x++);return*this;}template<typename t>q&operator<<(t x){if(!x)w(48);else if(x<0)for(w(45);x;x/=10)*p++=48|-(x%10);else for(;x;x/=10)*p++=48|x%10;while(p!=h)w(*--p);return*this;}}qio;}using nqio::qio;
struct ele{
	int va,id;bool isup;
	ele(int va=0,int id=0,bool isup=0):va(va),id(id),isup(isup){}
	bool operator < (const ele &b)const{return va<b.va;}
}arr[MXN];


int indr,curres,curcnt,mn;
inline int gid(int id,bool isup){return id+(isup?n:0);}
inline void add(int id,bool isup){
	vis[gid(id,isup)]=1;
	if(!vis[gid(id,!isup)]){
		curcnt++;
		curres+=!isup;
	}
	else if(isup)curres--;
}
inline void del(int id,bool isup){
	if(!vis[gid(id,!isup)]){
		curcnt--;
		curres-=!isup;
	}
	else if(isup)curres++;
	vis[gid(id,isup)]=0;
}
inline bool chk(int x){
	mn=INF,indr=0;
	for(int i=1;i<=(n<<1);i++){
		while(indr<(n<<1) && arr[indr+1].va<=arr[i].va+x){
			indr++;
			add(arr[indr].id,arr[indr].isup);
		}
		if(curcnt==n)mn=min(mn,curres);
		del(arr[i].id,arr[i].isup);
	}
	return mn<=m;
}

int main(){
    qio>>n>>m;
	for(int i=1;i<=n;i++)qio>>a[i];
	for(int i=1;i<=n;i++)qio>>b[i];
	for(int i=1;i<=n;i++){
		arr[i]=ele(a[i],i,1);
		arr[i+n]=ele(b[i],i,0);
	}
	sort(arr+1,arr+1+(n<<1));
	int l=0,r=INF;
	while(l<r){
		int mid=(l+r)>>1;
		if(chk(mid))r=mid;
		else l=mid+1;
	}
	qio<<l;
	return 0;
}
2021/4/19 11:44
加载中...