这种强制在线的题怎么对拍啊
  • 板块学术版
  • 楼主Phrvth
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/18 20:14
  • 上次更新2023/11/2 13:00:33
查看原帖
这种强制在线的题怎么对拍啊
520544
Phrvth楼主2023/10/18 20:14

我想问问就是类似于 P6587 的这种 Trie+线段树 强制在线的题怎么对拍

如果哪位佬实力强劲,一眼看出我哪里错了那就更好了/kel

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int MAXN = 2e5 + 7;
const int Siz = 6.2e6 + 7;

int n, m;

struct Trie {
	struct Node { int l, r, sum, lz, cnt; } t[Siz];
	#define ls(i) (t[i].l)
	#define rs(i) (t[i].r)
	
	int siz = 1;
	
	void push_up(int cur) { t[cur].sum = t[ls(cur)].sum + t[rs(cur)].sum; t[cur].cnt = t[ls(cur)].cnt + t[rs(cur)].cnt; }	
	void f(int cur, int k) { t[cur].sum += k * t[cur].cnt, t[cur].lz += k; }
	void push_down(int cur) { 
		if (ls(cur)) f(ls(cur), t[cur].lz);
		if (rs(cur)) f(rs(cur), t[cur].lz);
		t[cur].lz = 0;
	}
	
	void insert(int &cur, int x, int v, int dep) {
		if (dep > 31) return ;
		if (! cur) { cur = ++ siz; }
		t[cur].sum += v, t[cur].cnt ++;
		if (x & (1 << dep - 1)) insert(rs(cur), x, v, dep + 1);
		else insert(ls(cur), x, v, dep + 1);
	}
	void modify(int cur, int x, int y, int v, int dep) {
		if (dep > x + 1) return ;
		if (dep == x + 1) { f(cur, v); return ; }
		if (! cur) return ;
		push_down(cur);
		if (y & (1 << dep - 1)) modify(rs(cur), x, y, v, dep + 1);
		else modify(ls(cur), x, y, v, dep + 1);
		push_up(cur); 
	}
	int query(int cur, int x, int y, int dep) {
		if (dep > x + 1) return 0;
		if (dep == x + 1) return t[cur].sum;
		if (! cur) return 0;
		push_down(cur);
		if (y & (1 << dep - 1)) return query(rs(cur), x, y, dep + 1);
		else return query(ls(cur), x, y, dep + 1);
	}
} Trie;

int root = 1;

signed main () {
	ios :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	
	cin >> n >> m;
	for (int i = 1, x; i <= n; i ++) cin >> x, Trie.insert(root, i, x, 1);
	int lastans = 0;
	while (m --) {
		int opt; cin >> opt;
		opt = (opt + lastans) % 2 + 1;
		if (opt == 1) {
			int x, y, v; cin >> x >> y >> v;
			Trie.modify(root, x, y, v, 1); 
		} else {
			int x, y; cin >> x >> y;
			cout << (lastans = Trie.query(root, x, y, 1)) << '\n';
		}
	}
	return 0;
}
2023/10/18 20:14
加载中...