社区讨论

求条,是由乃救爷爷,我们没救了!(样例不过,笛卡尔树优良码风)

P3793由乃救爷爷参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mlh9kekj
此快照首次捕获于
2026/02/11 08:00
上周
此快照最后确认于
2026/02/12 14:55
上周
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
namespace GenHelper {
	unsigned z1, z2, z3, z4, b;
	unsigned rand_() {
		b = ((z1 << 6)^z1) >> 13;
		z1 = ((z1 & 4294967294U) << 18)^b;
		b = ((z2 << 2)^z2) >> 27;
		z2 = ((z2 & 4294967288U) << 2)^b;
		b = ((z3 << 13)^z3) >> 21;
		z3 = ((z3 & 4294967280U) << 7)^b;
		b = ((z4 << 3)^z4) >> 12;
		z4 = ((z4 & 4294967168U) << 13)^b;
		return (z1 ^ z2 ^ z3 ^ z4);
	}
}
void srand(unsigned x) {
	using namespace GenHelper;
	z1 = x;
	z2 = (~x) ^ 0x233333333U;
	z3 = x ^ 0x1234598766U;
	z4 = (~x) + 51;
}
int read() {
	using namespace GenHelper;
	int a = rand_() & 32767;
	int b = rand_() & 32767;
	return a * 32768 + b;
}
const int N = 2e7 + 5;
struct node {
	ll x,id;
} a[N];
int ls[N],rs[N];
ll ans;
void paint(int l,int r,int x) {
	if(!x) return ;
	if(l <= a[x].id && a[x].id <= r) ans = max(ans,a[x].x);
	if(a[x].id > r) {
		paint(l,r,ls[x]);
	}
	else {
		paint(l,r,rs[x]);
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
	int n,m,s;
	cin >> n >> m >> s;
	srand(s);
	for(int i = 1;i <= n;i++) a[i].x = read(),a[i].id = i;
	sort(a + 1,a + n + 1,[](node x,node y) {
		return x.x < y.x;
	});
	stack <int> st;
	for(int i = 1;i <= n;i++) {
		while(!st.empty() && a[st.top()].id > a[i].id) st.pop();
		if(!st.empty()) {
			int x = st.top();
			ls[i] = rs[x];
			rs[x] = i;
		}
		else {
			ls[i] = rs[0];
			rs[0] = i;
		}
		st.push(i);
	}
	ll ANS = 0;
	while(m--) {
		int l,r;
		l = read() % n + 1,r = read() % n + 1;
		if(l > r) swap(l,r);
		ans = LLONG_MIN;
		paint(l,r,rs[0]);
		ANS += ans;
	}
	cout << ANS;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...