39 分求助
查看原帖
39 分求助
496008
HyB_Capricornus楼主2024/9/29 21:35
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#define int long long
#define N 300010
using namespace std;
int q,t;
int seg[N<<2];
int kkk[N];
struct Node{
	int id,ren;
};
void update(int u,int l,int r,int k,int d) {
	if (l==r) {
		seg[u]=d;
		return;
	}
	int mid=l+r>>1;
	if (mid>=k) update(u<<1,l,mid,k,d);
	else update(u<<1|1,mid+1,r,k,d);
	seg[u]=min(seg[u<<1],seg[u<<1|1]);
}
int query(int u,int l,int r,int ll,int rr) {
	if (ll<=l&&r<=rr) {
		return seg[u];
	}
	int mid=l+r>>1,ans=1e12;
	if (mid>=ll) ans=min(ans,query(u<<1,l,mid,ll,rr));
	if (mid<rr) ans=min(ans,query(u<<1|1,mid+1,r,ll,rr));
	return ans;
}
signed main(void) {
	ios::sync_with_stdio(false);
	cin >> q;
	for (int opt,a,b;q--;) {
		cin >> opt >> a;
		if (opt==1) {
			cin >> b;
			t++;
			kkk[t]=a;
			if (b) update(1,1,200000,t,0);
			else update(1,1,200000,t,a);
		} else if (opt==2) {
			update(1,1,200000,a,1e12);
			kkk[a]=0;
		} else {
			vector<Node> ve;
			for (;;) {
				int ll=1,rr=t;
				for (;ll<=rr;) {
					int mid=ll+rr>>1;
					if (query(1,1,200000,1,mid)<=a) rr=mid-1;
					else ll=mid+1;
				}
				int vvv1=ll;
				if (ll>t) break;
				if (kkk[ll]>a) {
					ve.push_back(Node{vvv1,a});
					kkk[vvv1]-=a;
					a=0;
					break;
				} else {
					a-=kkk[vvv1];
					ve.push_back(Node{vvv1,kkk[vvv1]});
					kkk[vvv1]=0;
					update(1,1,200000,vvv1,1e12);
				}
			}
			cout << ve.size() << endl;
			for (auto it:ve) cout << it.id << " " << it.ren << endl;
		}
	}
	return 0;
}

不知道 WA 在那里。

2024/9/29 21:35
加载中...