线段树20分WA了求调,谢谢了
查看原帖
线段树20分WA了求调,谢谢了
546830
XSean楼主2023/6/7 16:32
#include <bits/stdc++.h>

#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define pre(i, a, b) for(int i = (a); i >= (b); i--)
#define Ede(i, u) for(int i = h[u]; i; i = ne[i])
#define go(i, a) for(auto i : a)
//#define int long long
#define LL long long
#define ULL unsigned long long
#define PII pair<int, int>
#define PIL pair<int, long long>
#define PLI pair<long long, int>
#define PLL pair<long long, long long>
#define mp make_pair
#define eb emplace_back
#define opb pop_back
#define pb push_back
#define pf push_front
#define fi first
#define se second
#define sf scanf
#define prf printf
#define el putchar('\n')
#define mms(arr, n) memset(arr, n, sizeof(arr))
#define mmc(arr1, arr2) memcpy(arr1, arr2, sizeof(arr2))
#define Db(x) prf("test(%s): ", x)
const int inf = 0x3f3f3f3f;

template <typename T> inline void rd(T &x){
	x = 0; bool f = true; char ch = getchar();
	while(ch < '0' || ch > '9'){ if(ch == '-') f = false; ch = getchar();}
	while(ch >= '0' && ch <= '9'){ x = (x << 1) + (x << 3) + (ch ^ '0'); ch = getchar();}
	if(!f) x = -x;
}
template <typename T, typename ...Args> inline void rd(T &x, Args &...args){ rd(x); rd(args...);}
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)  
using namespace std;

const int N = 4e5 + 10;
int n, m;
int Sum[N << 2], tag[N << 2];
char ins[2];
void pushup(int p){
	Sum[p] = Sum[ls(p)] + Sum[rs(p)];
}
void addtag(int p, int l, int r){
	Sum[p] = 0;
	tag[p] = 1;
}
void pushdown(int p, int l, int r){
	if(!tag[p]) return;
	int mid = (l + r) >> 1;
	addtag(ls(p), l, mid);
	addtag(rs(p), mid + 1, r);
	tag[p] = 0;
}
void modify(int p, int l, int r, int pos, int t){
	if(l == r){
		Sum[p] += t;
		return;
	}
	int mid = (l + r) >> 1;
	if(pos <= mid) modify(ls(p), l, mid, pos, t);
	else modify(rs(p), mid + 1, r, pos, t);
	pushup(p);
}
int query(int p, int l, int r, int ql, int qr){
	if(ql <= l && r <= qr) return Sum[p];
	int mid = (l + r) >> 1;
	int res = 0;
	pushdown(p, l, r);
	if(ql <= mid) res += query(ls(p), l, mid, ql, qr);
	if(mid <  qr) res += query(rs(p), mid + 1, r, ql, qr);
	return res; 
}
void Clear(int p, int l, int r, int ql, int qr){
	if(ql <= l && r <= qr){
		addtag(p, l, r);
		return;
	}
	int mid = (l + r) >> 1;
	pushdown(p, l, r);
	if(ql <= mid) Clear(ls(p), l, mid, ql, qr);
	if(mid <  qr) Clear(rs(p), mid + 1, r, ql, qr);
	pushup(p);
}
int kth(int p, int l, int r, int k){
	if(l == r) return l;
	int mid = (l + r) >> 1;
	if(k <= Sum[rs(p)]) return kth(rs(p), mid + 1, r, k);
	else return kth(ls(p), l, mid, k - Sum[rs(p)]);
}
int main(){
	/*
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
	*/
	rd(n, m);
	int k, mark = -2e5, ans = 0;
	m -= mark;
	rep(i, 1, n){
		sf("%s%d", ins, &k);
		if(ins[0] == 'I'){
			if(k -  mark < m) continue;
			modify(1, 1, N, k - mark, 1);
		}else if(ins[0] == 'A'){
			m -= k, mark += k; //相对
		}else if(ins[0] == 'S'){
			m += k, mark -= k;
			if(m > 1/*可修改*/){
				ans += query(1, 1, N, 1, m - 1);	
				Clear(1, 1, N, 1, m - 1);
			}
		}else if(ins[0] == 'F'){
			if(query(1, 1, N, 1, N) < k) puts("-1");
			else prf("%d\n", kth(1, 1, N, k) + mark);
		}
	}
	prf("%d\n", ans);
	return 0;
}





2023/6/7 16:32
加载中...