社区讨论

WA On #126 求条

P7562[JOISC 2021] イベント巡り 2 (Event Hopping 2) (Day4)参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@misv0eka
此快照首次捕获于
2025/12/05 20:47
2 个月前
此快照最后确认于
2025/12/07 14:40
2 个月前
查看原帖
这才是世界上最绝望的死法
CPP
#include<bits/stdc++.h>

using namespace std;
const int N=1e5+5;
int read(){
	int sum=0,fg=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') fg=-1;
		c=getchar();
	}
	while('0'<=c&&c<='9'){
		sum=sum*10+c-'0';
		c=getchar();
	}
	return sum*fg;
}

struct seg{
	int l,r;
	seg(int _l=0,int _r=0){
		l=_l,r=_r;
	}
	bool operator<(const seg &o) const{
		return r<o.l;
	}
} a[N];

void init();
void solve();

int main(){
	init();
	solve();
	return 0;
}

int n,m,k,b[N<<1],f[19][N<<1];

void init(){
	n=read(),k=read();
	for(int i=1;i<=n;++i){
		b[++m]=a[i].l=read();
		b[++m]=a[i].r=read();
	}
	sort(b+1,b+m+1);
	m=unique(b+1,b+m+1)-(b+1);
	for(int i=1;i<=n;++i){
		a[i].l=lower_bound(b+1,b+m+1,a[i].l)-b;
		a[i].r=lower_bound(b+1,b+m+1,a[i].r)-b;
	}
	for(int i=0;i<19;++i)
		for(int j=1;j<=m+5;++j)
			f[i][j]=m+5;
	for(int i=1;i<=n;++i) f[0][a[i].l]=a[i].r;
	for(int i=m;i;--i) f[0][i]=min(f[0][i],f[0][i+1]);
	for(int i=1;i<19;++i)
		for(int j=1;j<=m;++j)
			if(f[i-1][j]<=m)
				f[i][j]=f[i-1][f[i-1][j]];
}

int query(int l,int r){
	int res=0,now=l;
	for(int i=18;~i;--i)
		if(f[i][now]<=r){
			now=f[i][now];
			res+=1<<i;
		}
	return res;
}

void solve(){
	vector<int> res;
	set<seg> s;
	s.insert(seg(1,m));
	int cnt=query(1,m);
	for(int i=1;i<=n;++i){
		set<seg>::iterator it=s.find(a[i]);
		if(res.size()==k) break;
		if(it==s.end()) continue;
		int l=it->l,r=it->r;
		if(a[i].l<l||r<a[i].r) continue;
		int now=cnt-query(l,r)+query(l,a[i].l)+query(a[i].r,r);
		if(now>=k-res.size()-1){
			cnt=now;
			res.push_back(i);
			s.erase(it);
			s.insert(seg(l,a[i].l));
			s.insert(seg(a[i].r,r));
		}
	}
	if(res.size()<k) puts("-1");
	else for(int i: res) printf("%d\n",i);
}

回复

1 条回复,欢迎继续交流。

正在加载回复...