权值线段树,40分,求调
查看原帖
权值线段树,40分,求调
649451
wuyuhann123456789楼主2024/10/25 08:16
#include<stdio.h>
#include<algorithm>
typedef long long ll;
ll map[300010],move[300010],k[300010];
char c[300010];
struct tree {
	int l,r,sum;
} tr[1200010];
int Find(ll x,int r) {
	int l=1,ans=0;
	while(l<=r) {
		int mid=(l+r)/2;
		if(map[mid]==x)
			return mid;
		if(map[mid]<x) {
			l=mid+1;
			ans=mid;
		} else
			r=mid-1;
	}
	return ans;
}
void build(int i,int l,int r) {
	tr[i].l=l;
	tr[i].r=r;
	if(l==r)
		return;
	int mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
}
void push_up(int i) {
	tr[i].sum=tr[i*2].sum+tr[i*2+1].sum;
}
void add(int i,int x) {
	if(tr[i].r<x||tr[i].l>x) return ;
	if(x<=tr[i].l&&tr[i].r<=x) {
		tr[i].sum++;
		return ;
	}
	add(i*2,x);
	add(i*2+1,x);
	push_up(i);
}
void dele(int i,int r) {
	if(tr[i].l>r)
		return ;
	if(tr[i].l==tr[i].r) {
		tr[i].sum=0;
		return ;
	}
	dele(i*2,r);
	dele(i*2+1,r);
	push_up(i);
}
int find(int i,int k) {
	if(tr[i].l==tr[i].r)
		return tr[i].l;
	if(tr[i*2].sum>=k)
		return find(i*2,k);
	return find(i*2+1,k-tr[i*2].sum);
}
int main() {
	int n,sum=0,minn,tot=0;
	scanf("%d%d",&n,&minn);
	for(int i=1; i<=n; i++) {
		c[i]=getchar();
		while(!(c[i]>='A'&&c[i]<='Z'))
			c[i]=getchar();
		scanf("%lld",&k[i]);
		move[i]=move[i-1];
		switch(c[i]) {
			case 'I':
				map[++sum]=k[i]-move[i];
				tot++;
				break;
			case 'A':
				move[i]=move[i]+k[i];
				break;
			case 'S':
				move[i]=move[i]-k[i];
		}
	}
	std::sort(map+1,map+1+sum);
	std::unique(map+1,map+1+sum);
	for(int i=sum;i>=1;i--)
		if(map[i]==map[i-1])
			sum--;
		else
			break;
	build(1,1,sum);
	for(int i=1; i<=n; i++) {
		switch(c[i]) {
			case 'I':
				if(k[i]>=minn) {
					int num=Find(k[i]-move[i],sum);
					add(1,num);
				}
				break;
			case 'S':
				if(minn-move[i]>map[1]) {
					int x=Find(minn-move[i],sum);
					while(map[x]>=minn-move[i])
						x--;
					dele(1,x);
				}
				break;
			case 'F':
				if(k[i]>tr[1].sum) {
					printf("-1\n");
					break;
				}
				int u = find(1,tr[1].sum-k[i]+1);
				printf("%lld\n",map[u]+move[i]);
		}
	}
	printf("%d",tot-tr[1].sum);
	return 0;
}
2024/10/25 08:16
加载中...