60pts求调,但是线段树(玄关)
查看原帖
60pts求调,但是线段树(玄关)
292725
laol楼主2024/11/18 11:38
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int n,m;
struct seg{
	int mi[N<<2],laz[N<<2],ans;
	#define ls now<<1
	#define rs now<<1|1
	#define mid ((l+r)>>1)
	#define lo l,mid,ls
	#define ro mid+1,r,rs
  //马蜂奇特请见谅
	inline void pd(int now){
		mi[ls]=max(0ll,mi[ls]-laz[now]);
		mi[rs]=max(0ll,mi[rs]-laz[now]);
		laz[ls]+=laz[now];
		laz[rs]+=laz[now];
		laz[now]=0ll;
	}
	int query(int l,int r,int now,int s){
		if(l==r)return mi[now]+=s,l;
		pd(now);
		if(mi[ls]==mi[now])ans=query(lo,s);
		else ans=query(ro,s);
		mi[now]=min(mi[ls],mi[rs]);
		return ans;
	}//合并了修改操作
	
}T;
vector<int>g[N];
struct ll{int s,t,id;}a[N];
signed main(){
//	freopen("print4.in","r",stdin);
//	freopen("ans.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i].s=read(),a[i].t=read(),a[i].id=i;
	sort(a+1,a+1+n,[](ll a,ll b){return a.t<b.t;});
	for(int i=1;i<=n;i++){
		T.mi[1]-=(a[i].t-a[i-1].t);
		T.laz[1]+=(a[i].t-a[i-1].t);
		T.mi[1]=max(0ll,T.mi[1]); 
		g[T.query(1,n,1,a[i].s)].push_back(a[i].id);
	}
	for(int i=1;i<=m;i++){
		printf("%lld ",g[i].size());
		sort(g[i].begin(),g[i].end());
		for(auto v:g[i])printf("%lld ",v);
		puts("");
	}
	return 0;
}


2024/11/18 11:38
加载中...