求条玄关
查看原帖
求条玄关
663199
Tachibana27楼主2025/1/10 16:49
#include<bits/stdc++.h>
int n,k,m;
class node{
	public:
		int l;
		int r;
		bool flag;
}a[100086];
int c[1000086];
int cnt;
int sum;
bool nsol;
std::pair<int,int>qwq[100086],awa[100086];
int point,pt;
int f[1000086];
int g[1000086];
int main(){
	std::cin>>n>>k>>m;
	for(int i=1;i<=m;i++){
		std::cin>>a[i].l>>a[i].r>>a[i].flag;
		if(not a[i].flag){
			c[a[i].l]++;
			c[a[i].r+1]--;
		}
	}
	for(int i=1;i<=n;i++){
		sum+=c[i];
		if(not sum){
			point++;
			qwq[i]=std::make_pair(i,i);
		}
	}
	if(point==k){
		for(int i=1;i<=n;i++)
			if(qwq[i].first)
				std::cout<<qwq[i].first<<"\n";
		exit(0);
	}
	// puts("--------------------");
	// for(int i=1;i<=n;i++)
	// 	std::cout<<qwq[i].first<<" "<<qwq[i].second<<"\n";
	// puts("--------------------");
	qwq[n+1]=std::make_pair(n+1,0);
	for(int i=1;i<=n;i++)
		if(not qwq[i].second)
			qwq[i].second=qwq[i-1].second;
	for(int i=n;i;i--)
		if(not qwq[i].first)
			qwq[i].first=qwq[i+1].first;
	for(int i=1;i<=m;i++)
		if(a[i].flag and qwq[a[i].l].first<=qwq[a[i].r].second)
			awa[++pt]=std::make_pair(qwq[a[i].l].first,qwq[a[i].r].second);
	point=0;
	std::sort(awa+1,awa+1+pt);
	for(int i=1;i<=pt;i++){
		while(point and awa[i].first>=qwq[point].first and awa[i].second<=qwq[point].second)
			point--;
		qwq[++point]=awa[i];
	}
	// puts("--------------------");
	// for(int i=1;i<=point;i++)
	// 	std::cout<<qwq[i].first<<" "<<qwq[i].second<<"\n";
	// puts("--------------------");
	int lst=0;

	for(int i=1;i<=point;i++)
		if(qwq[i].second>lst){
			lst=qwq[i].second;
			f[i]=f[i-1]+1;
		}
		else
			f[i]=f[i-1];
	lst=n+1;
	for(int i=point;i;i--)
		if(qwq[i].first<lst){
			lst=qwq[i].first;
			g[i]=g[i+1]+1;
		}
		else
			g[i]=g[i+1];
	for(int i=1;i<=point;i++)
		if(f[i]==f[i-1]+1){
			if(qwq[i].first==qwq[i].second){
				std::cout<<qwq[i].first<<"\n";
				nsol=true;
			}
			int l=1;
			int r=i-1;
			int ans1=0;
			int ans2=point-1;
			#define mid ((l+r)>>1)
			while(l<=r)
				if(qwq[mid].second<=qwq[i].second){
					ans1=mid;
					l=mid+1;
				}
				else
					r=mid-1;
			l=i+1;
			r=n;
			while(l<=r)
				if(qwq[mid].first>=qwq[i].second){
					ans2=mid;
					r=mid-1;
				}
				else
					l=mid+1;
			#undef mid
			if(f[ans1]+g[ans2]>k){
				std::cout<<qwq[i].second<<"\n";
				nsol=true;
			}
		}
	if(nsol);
	else
		puts("-1");
	return 0;
}

this

2025/1/10 16:49
加载中...