0pts求调!一颗线段树解法!
查看原帖
0pts求调!一颗线段树解法!
463956
incra楼主2023/9/3 19:01

rt,有没有大佬给个Hack数据啊啊啊,还是我题目理解错了,望大佬指出错误。

代码如下:

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int,int> PII;
const int dx[] = {1,-1,0,0},dy[] = {0,0,1,-1};
bool LAST = false;
istream& operator >> (istream& in,char* s) {
    if (LAST) exit (0);
	char ch = cin.get ();
	while ((isspace (ch) || ch == '\n') && ch != EOF) ch = cin.get ();
	int n = 0;
	while (!(isspace (ch) || ch == '\n') && ch != EOF) s[n++] = ch,ch = cin.get ();
	s[n] = '\0';
	if (ch == EOF) LAST = true;
	return in;
}
const int N = 100010,MOD = 1e9 + 9;
int n,q;
int a[N];
struct segment_tree_node {
	int l,r;
	int val;
	LL sum;
	int tag;
}tr[4 * N];
void push_up (int u) {
	tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void opt_tag (int u,int d) {
	if (!tr[u].val) tr[u].sum += d * 2;
	else tr[u].sum += d;
	tr[u].val = max (tr[u].val - d,0);
	tr[u].tag += d;
}
void push_down (int u) {
	if (tr[u].tag) {
		opt_tag (u << 1,tr[u].tag),opt_tag (u << 1 | 1,tr[u].tag);
		tr[u].tag = 0;
		return ;
	}
}
void build_segment_tree (int u,int l,int r) {
	tr[u] = {l,r,a[l],0,0};
	if (l == r) return ;
	int mid = l + r >> 1;
	build_segment_tree (u << 1,l,mid),build_segment_tree (u << 1 | 1,mid + 1,r);
}
void modify (int u,int l,int r,int d) {
	if (l <= tr[u].l && tr[u].r <= r) {
		opt_tag (u,d);
		return ;
	}
	push_down (u);
	int mid = tr[u].l + tr[u].r >> 1;
	if (l <= mid) modify (u << 1,l,r,d);
	if (r >= mid + 1) modify (u << 1 | 1,l,r,d);
	push_up (u);
}
LL query (int u,int x) {
	if (tr[u].l == tr[u].r) return tr[u].sum;
	push_down (u);
	int mid = tr[u].l + tr[u].r >> 1;
	if (x <= mid) return query (u << 1,x);
	return query (u << 1 | 1,x);
}
int main () {
	cin >> n >> q;
	for (int i = 1;i <= n;i++) cin >> a[i];
	build_segment_tree (1,1,n);
	LL ans = 0;
	while (q--) {
		char op;
		cin >> op;
		if (op == 'A') {
			int l,r,x;
			cin >> l >> r >> x;
			modify (1,l,r,x);
		}
		else {
			int x;
			cin >> x;
			ans += query (1,x);
		}
	}
	cout << ans % MOD << endl;
	return 0;
}
2023/9/3 19:01
加载中...