下载数据可通过,却wa了??
查看原帖
下载数据可通过,却wa了??
372172
Q__A__Q楼主2023/9/1 18:39
// Problem: P1486 [NOI2004] 郁闷的出纳员
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1486
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Author: fzy
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
// #pragma GCC optimize(2)
using namespace std;
typedef long long ll;
#define int ll

const int maxn=1e5+10;
const int inf=1e9+7;
int n,low,ans;

inline int read() {
    int s=0,w=1;
    char ch=getchar();
    while(!isdigit(ch)) {
        if(ch=='-')w=-1;
        ch=getchar();
    }
    while(isdigit(ch)) s=s*10+ch-'0',ch=getchar();
    return s*w;
}

inline void write(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

int root=0;
int son[maxn][2],siz[maxn],num[maxn],val[maxn],pri[maxn],tot=0;
mt19937 rnd(time(0));

inline void pushup(int rt) {
	siz[rt]=siz[son[rt][0]]+siz[son[rt][1]]+num[rt];
}

inline void rotate(int &rt,int d) {
	int t=son[rt][d];
	son[rt][d]=son[t][d^1];
	son[t][d^1]=rt;
	pushup(rt),pushup(t);
	rt=t;
}

inline void insert(int &rt,int k) {
	if(!rt) {
		rt=++tot;
		siz[rt]=num[rt]=1;
		pri[rt]=rnd();
		val[rt]=k;
		return;
	}
	if(val[rt]==k) {
		num[rt]++;
		siz[rt]++;
		return;
	}
	int d=(val[rt]<k);
	insert(son[rt][d],k);
	if(pri[rt]<pri[son[rt][d]]) rotate(rt,d);
	pushup(rt);
}

inline void del(int &rt,int k) {
	if(!rt) return;
	if(val[rt]<k) del(son[rt][1],k);
	else if(val[rt]>k) del(son[rt][0],k);
	else {
		if(num[rt]>1) num[rt]--,siz[rt]--;
		else if(!son[rt][0]||!son[rt][1]) rt=son[rt][0]+son[rt][1];
		else {
			int d=(pri[son[rt][0]]<pri[son[rt][1]]);
			rotate(rt,d^1);
			del(rt,k);
		}
	}
	pushup(rt);
}

inline int findpre(int rt,int k) {
	if(!rt) return -inf;
	if(val[rt]<k) return max(val[rt],findpre(son[rt][1],k));
	else return findpre(son[rt][0],k);
}

inline int findkth(int rt,int k) {
	if(!rt) return 0;
	if(k>siz[son[rt][0]]+num[rt]) 
		return findkth(son[rt][1],k-siz[son[rt][0]]-num[rt]);
	else if(k<=siz[son[rt][0]]) return findkth(son[rt][0],k);
	else return val[rt];
}

signed main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
    n=read(),low=read();
    int add=0,in=0;
    while(n--) {
    	char opt=getchar();
    	int x=read();
    	if(opt=='I') {
    		if(x-add>=low) insert(root,x-add),in++;
    	}
    	else if(opt=='A') low-=x,add+=x;
    	else if(opt=='S') {
    		low+=x,add-=x;
    		int tmp=low;
    		while(findpre(root,tmp)!=-inf) {
    			int temp=findpre(root,tmp);
    			del(root,temp);
    		}
    	}
    	else {
    		if(siz[root]<x) puts("-1");
    		else write(findkth(root,siz[root]-x+1)+add),puts("");
    	}
    }
    write(in-siz[root]),puts("");
    return 0;
}

数据:

20 0
I 4
F 1
I 6
S 9
F 14
I 6
I 7
A 8
I 3
F 2
I 9
I 6
I 6
S 3
S 5
I 6
F 1
I 3
A 2
F 5

答案:

4
-1
14
7
3
5

2023/9/1 18:39
加载中...