fhq treap 提问
查看原帖
fhq treap 提问
178519
tidongCrazy楼主2020/8/7 20:32

rt

调了好久了,样例总是输出 1

#include <ctime>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e6 + 5;

inline int read() {
	
	int w = 1, s = 0; char c;
	while(!isdigit(c = getchar())) if(c == '-') w = -1;
	while(isdigit(c)) s = (s << 1) + (s << 3) + (c & 15), c = getchar();
	return s * w;
	
}

struct Node { int l, r, v, rand, siz, rev, tag, maxx; };

Node tr[N];

int siz, rt, x, y, z;

inline void push_up(int x) {
	
	tr[x].siz = tr[tr[x].l].siz + tr[tr[x].r].siz + 1;
	tr[x].maxx = tr[x].v;
	if(tr[x].l) tr[x].maxx = max(tr[x].maxx, tr[tr[x].l].maxx);
	if(tr[x].r) tr[x].maxx = max(tr[x].maxx, tr[tr[x].r].maxx);
	
}

inline void push_down(int x) {
	
	if(tr[x].rev) {
		if(tr[x].l) tr[tr[x].l].rev ^= 1;
		if(tr[x].r) tr[tr[x].r].rev ^= 1;
		tr[x].l ^= tr[x].r ^= tr[x].l ^= tr[x].r;
		tr[x].rev = 0;
	} if(tr[x].tag) {
		if(tr[x].l) tr[tr[x].l].tag += tr[x].tag, tr[tr[x].l].maxx += tr[x].tag, tr[tr[x].l].v += tr[x].tag;
		if(tr[x].r) tr[tr[x].r].tag += tr[x].tag, tr[tr[x].r].maxx += tr[x].tag, tr[tr[x].r].v += tr[x].tag;
		tr[x].tag = 0;
		push_up(x);
	}
	
}

inline void split(int now, int v, int &x, int &y) {
	
	if(!now) { x = y = 0; return; }
	push_down(now);
	if(tr[now].v <= v) x = now, split(tr[now].r, v, tr[now].r, y);
	else y = now, split(tr[now].l, v, x, tr[now].l);
	push_up(now);
	
}

inline int merge(int x, int y) {
	
	push_down(x); push_down(y);
	if(!x || !y) return x | y;
	if(tr[x].rand < tr[y].rand) {
		tr[x].r = merge(tr[x].r, y);
		push_up(x);
		return x;
	} else {
		tr[y].l = merge(tr[y].l, x);
		push_up(y);
		return y;
	}
	
}

//inline int getrk(int now, int k) {
//	
//	while(1) {
//		if(k <= tr[tr[now].l].siz) now = tr[now].l;
//		else if(k == tr[tr[now].l].siz + 1) return now;
//		else k -= tr[tr[now].l].siz + 1, now = tr[now].r;
//	}
//	
//}

inline void modify1(int l, int r, int v) {
	
	int x, y, z;
	split(rt, l - 1, x, y);
	split(y, r - l + 1, y, z);
	tr[y].maxx += v;
	tr[y].tag += v;
	tr[y].v += v;
	rt = merge(merge(x, y), z);
	
}

inline void modify2(int l, int r) {
	
	split(rt, l - 1, x, y);
	split(y, r - l + 1, y, z);
	tr[y].rev ^= 1;
	rt = merge(merge(x, y), z);
	
}

inline void query(int l, int r) {
	
	split(rt, l - 1, x, y);
	split(y, r - l + 1, y, z);
	printf("%d\n", tr[y].maxx);
	rt = merge(merge(x, y), z);
	
}

inline int create(int v) {
	
	tr[++ siz].siz = 1;
	tr[siz].v = v;
	tr[siz].rand = rand();
	tr[siz].maxx = v;
	rt = merge(rt, siz);
	return siz;
	
}

inline int insert(int v) {
	
	split(rt, v, x, y);
	rt = merge(merge(x, create(v)), y);
	
}

int main() {
	
	srand(time(NULL));
	int n = read(), m = read();
	for(int i = 1;i <= n; i ++ ) insert(0);
	for(int i = 1;i <= m; i ++ ) {
		int opt = read(), l = read(), r = read(), v;
		if(opt == 1) v = read(), modify1(l, r, v);
		if(opt == 2) modify2(l, r);
		if(opt == 3) query(l, r);
	}
	
}
2020/8/7 20:32
加载中...