P7562 求调
查看原帖
P7562 求调
282016
I_Love_Potter楼主2022/6/18 15:25
#include<bits/stdc++.h>
//#include<graphics.h>
#define N 200005
using namespace std;
/*
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<='0'||ch>'9'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
*/
int l[N],r[N],f[N][20],a[N],b[N],le,len,logk,n,k;
struct node{
	int l,r;
	bool operator<(const node o)const{return r<o.l;}
};
set<node> s;
int cal(int l,int r){
	if(l>r) return 0;
	int an=0;
	for(int i=logk;i>=0;i--) if(f[l][i]-1<=r){
		an+=1<<i;
		l=f[l][i];
	}
}
int main(){
    //freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	//std::ios::sync_with_stdio(false);
	int n,k;
	cin>>n>>k;
	logk=log2(k);
	for(int i=1;i<=n;i++){
		cin>>l[i]>>r[i];
		a[++le]=l[i];
		a[++le]=r[i];
	}
	sort(a+1,a+1+n);
	for(int i=1;i<=le;i++) 
	    if(a[i]!=a[i-1]) 
		    b[++len]=a[i];
	for(int i=1;i<=n;i++){
		l[i]=lower_bound(b+1,b+1+len,l[i])-b;
		r[i]=lower_bound(b+1,b+1+len,r[i])-b;
	} 
    for(int i=1;i<=len+2;i++) 
	    for(int j=0;j<=logk;j++) 
		    f[i][j]=len+2;
    for(int i=1;i<=n;i++)
    	f[l[i]][0]=min(f[l[i]][0],r[i]);
    for(int i=len;i>=1;i--){
    	f[i][0]=min(f[i][0],f[i+1][0]);
    	for(int j=1;j<=logk;j++) 
		    f[i][j]=min(f[i+1][j],f[f[i][j-1]][j-1]);
	}
	node xx;
	xx.l=1,xx.r=len;
	s.insert(xx);
	int now=cal(1,len);
	if(now<k){
		cout<<-1;
		return 0;
	}
	for(int i=1;i<=n;i++){
		node x;
		x.l=l[i],x.r=r[i]-1;
		if(s.find(x)==s.end()) continue;
		node c=*s.find(x);
		if(c.l<=l[i] && c.r>=r[i]-1){
			int gongx=cal(c.l,l[i]-1)+cal(r[i],c.r)-cal(c.l,c.r);
			if(gongx+now+1>=k){
				cout<<i<<endl;
				k--;
				now+=gongx;s.erase(c);
				if(c.l<l[i]){
					node xxx;
					xxx.l=c.l;
					xxx.r=l[i]-1;
					s.insert(xxx);
				}
				if(c.r>=r[i]){
					node xxx;
					xxx.l=r[i];
					xxx.r=c.r;;
					s.insert(xxx);
				}
			}
		}
		if(!k) return 0;
	}
	return 0;
}


thx

2022/6/18 15:25
加载中...