60分奇怪做法求调
查看原帖
60分奇怪做法求调
527417
541gdsb楼主2024/11/20 20:44

RT

#include<iostream>
#include<algorithm>
using namespace std;
struct ff {
	long long int i;
	long long int sum;
	long long int next;
	bool cs;
} a[10000000];
long long int t=0;
long long int wj[1000000];
long long int b[10000000];
long long int bt;
bool cmp(ff x,ff y) {
	if(x.sum==y.sum) {
		return x.cs<y.cs;
	}
	return x.sum<y.sum;
}
void csh() {
	for(long long int i=1; i<=t; i++) {
		if(a[i].cs==0)wj[a[i].i]=i;
	}
	a[t+1].next=0;
	for(long long int i=t; i>=1; i--) {
		if(a[i].cs==1)a[i].next=i;
		else a[i].next=a[i+1].next;
	}
}
long long int find(long long int x) {
	if(a[x].next==0)return 0;
	if(a[x].next==x) {
		a[x].next=a[x+1].next;
		return x;
	}
	long long int u=find(a[x].next);
	a[x].next=a[u].next;
	return u;
}
int main() {
	long long int n,m;
	cin>>n>>m;
	for(long long int i=1; i<=n; i++) {
		t++;
		cin>>a[t].sum;
		a[t].i=i;
		a[t].cs=0;
		t++;
		cin>>a[t].sum;
		a[t].i=i;
		a[t].cs=1;
		a[t-1].sum+=a[t].sum;
	}
	sort(a+1,a+t+1,cmp);
	csh();
	for(long long int i=1; i<=m; i++) {
		bt=0;
		long long int u=find(1);
		while(1) {
			if(u==0)break;
			bt++;
			b[bt]=a[u].i;
			u=wj[a[u].i];
			u=find(u);

		}
		sort(b+1,b+bt+1);
		cout<<bt;
		for(long long int j=1; j<=bt; j++) {
			cout<<" "<<b[j];
		}
		cout<<endl;
	}
}
2024/11/20 20:44
加载中...