BZOJ-1563-郁闷的出纳员(权值线段树)

偏移量要考虑清楚。

#include <bits/stdc++.h>
using namespace std;

const int N=4e5+10;
const int BASE=1e5+1;
const int RIGHT=3e5+5e4;

int segtree[N<<2],lazy[N<<2];

void pushdown(int rt)
{
	if (lazy[rt]) {
		lazy[rt<<1]=lazy[rt<<1|1]=1;
		segtree[rt<<1]=segtree[rt<<1|1]=0;
		lazy[rt]=0;
	}
}

void Update(int val,int l,int r,int rt)
{
		if (l==r) {
			segtree[rt]++;
			return ;
		}
		pushdown(rt);
		int mid=(r+l)>>1;
		if (val<=mid) {
			Update(val,l,mid,rt<<1);
		}
		else {
			Update(val,mid+1,r,rt<<1|1);
		}
		segtree[rt]=segtree[rt<<1]+segtree[rt<<1|1];
}

void Delete(int L,int R,int l,int r,int rt)
{
	if (L<=l&&r<=R) {
		lazy[rt]=1;
		segtree[rt]=0;
		return ;
	}
	pushdown(rt);
	int mid=(l+r)>>1;
	if (L<=mid) {
		Delete(L,R,l,mid,rt<<1);
	}
	if (mid<R) {
		Delete(L,R,mid+1,r,rt<<1|1);
	}
	segtree[rt]=segtree[rt<<1]+segtree[rt<<1|1];
}

int Query(int val,int l,int r,int rt)
{
	if (l==r) {
		return l;
	}
	pushdown(rt);
	int mid=(l+r)>>1;
	if (segtree[rt<<1]>=val) {
		return Query(val,l,mid,rt<<1);
	}
	else {
		return Query(val-segtree[rt<<1],mid+1,r,rt<<1|1);
	}
}

int main()
{
	char op[10];
	int n,min_sal,tot=0,num,offset=0;
	scanf("%d%d",&n,&min_sal);
	for (int i=0;i<n;i++) {
		scanf("%s%d",op,&num);
		if (!strcmp(op,"I")) {
			if (num>=min_sal) {
				tot++;
				Update(num+BASE+offset,1,RIGHT,1);
			}
	
		}
		else if (!strcmp(op,"A")) {
			offset-=num;
		}
		else if (!strcmp(op,"S")) {
			offset+=num;
			Delete(1,BASE+min_sal-1+offset,1,RIGHT,1);
		}
		else {
			Delete(1,BASE+min_sal-1+offset,1,RIGHT,1);
			if (num>segtree[1]) {
				puts("-1");
			}
			else {
				printf("%d\n",Query(segtree[1]-num+1,1,RIGHT,1)-BASE-offset);
			}
		}
	}
	printf("%d\n",tot-segtree[1]);
	return 0;
}
posted @ 2019-09-11 23:20  xyee  阅读(141)  评论(0编辑  收藏  举报