悄咪咪的问一句
查看原帖
悄咪咪的问一句
342584
流夏的美楼主2021/4/9 13:25

这道题带懒标记的fhq能否可以做出来啊。

我尝试了一下只有10分QAQ

有哪位大佬能帮忙改一下吗QAQ

题解里好像没有带懒标记fhq

#include <stdio.h>
#include <iostream>
const long long N = 3e5 + 5;
const unsigned long long seed = 242520131;
unsigned long long keyword = 1;

struct node {
	long long size, key;
	long long val, tag;
	long long l, r;
} fhq[N];

long long n, min, m, cnt, root, x, y, leave;

void update(long long rt) {
	fhq[rt].size = fhq[fhq[rt].l].size + fhq[fhq[rt].r].size + 1;
	return ;
}

void updown(long long rt) {
	if(fhq[rt].tag) {
		fhq[fhq[rt].l].tag += fhq[rt].tag;
		fhq[fhq[rt].r].tag += fhq[rt].tag;
		fhq[fhq[rt].l].val += fhq[rt].tag;
		fhq[fhq[rt].r].val += fhq[rt].tag;
		fhq[rt].tag = 0;
	}
	
	return ;
}

long long merge(long long x, long long y) {
	if(!x || !y) return x + y;
	updown(x), updown(y);
	if(fhq[x].key >= fhq[y].key) {
		fhq[x].r = merge(fhq[x].r, y);
		update(x);
		return x;
	}
	else {
		fhq[y].l = merge(x, fhq[y].l);
		update(y);
		return y;
	}
}

void split(long long now, long long &x, long long &y, long long val) {
	if(!now) {
		x = y = 0;
		return ;
	}
	updown(now);
	if(fhq[now].val <= val) {
		x = now;
		split(fhq[now].r, fhq[now].r, y, val);
		update(x);
	}
	else {
		y = now;
		split(fhq[now].l, x, fhq[now].l, val);
		update(y);
	}
	return ;
}

long long new_node(long long val) {
	fhq[++cnt].val = val;
	fhq[cnt].size = 1;
	fhq[cnt].key = int(keyword *= seed);
	return cnt;
}

void ins(long long val) {
	split(root, x, y, val - 1);
	root = merge(merge(x, new_node(val)), y);
	return ;
}

void getnum(long long k) {
	split(root, x, y, min - 1);
	leave += fhq[x].size;
	root = y;
	if(fhq[root].size < k) {
		std :: cout << -1 << '\n';
		return ;
	}
	long long p = root;
	while(p) {
		if(fhq[fhq[p].r].size + 1 == k)
			break;
		if(fhq[fhq[p].r].size < k)
			k -= fhq[fhq[p].r].size + 1, p = fhq[p].l;
		else
			p = fhq[p].r;
	}
	std :: cout << fhq[p].val << '\n';
	return ;
}

signed main() {
	std :: ios :: sync_with_stdio(false);
	std :: cin >> n >> min;
	char opt;
	long long x;
	for(long long i = 1; i <= n; ++i) {
		std :: cin >> opt >> x;
		if(opt == 'I') {
			if(x < min) {
				++leave;
				continue;
			}
			ins(x);
		}
		if(opt == 'A') {
			fhq[root].tag += x;
			fhq[root].val += x;
		}
		if(opt == 'S') {
			fhq[root].tag -= x;
			fhq[root].val -= x;
			split(root, x, y, min - 1);
			root = y;
			leave += fhq[x].size;
		}
		if(opt == 'F') {
			getnum(x);
		}
	}
	std :: cout << leave << '\n';
	return 0;
}
2021/4/9 13:25
加载中...