RT
这个是不加long过的
#include <bits/stdc++.h>
using namespace std;
int n, p[10000005], lc[10000005], rc[10000005], fa[10000005];
long long lans = 0, rans = 0;
template<typename T>inline void read(T &ff) {
T rr = 1;
ff = 0;
register char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-')
rr = -1;
ch = getchar();
}
while (isdigit(ch)) {
ff = (ff << 1) + (ff << 3) + (ch ^ 48);
ch = getchar();
}
ff *= rr;
}
int main() {
read(n);
for (int i = 1; i <= n; i++) {
read(p[i]);
fa[i] = i - 1;
while (p[fa[i]] > p[i])
fa[i] = fa[fa[i]];
int modify = rc[fa[i]];
rc[fa[i]] = i;
fa[modify] = i;
lc[i] = modify;
}
for (int i = 1; i <= n; i++) {
lans ^= 1ll * i * (1 + lc[i]);
rans ^= 1ll * i * (1 + rc[i]);
}
printf("%lld %lld\n", lans, rans);
return 0;
}
这是我的,只有三十
#include <bits/stdc++.h>
#define maxn 10000005
using namespace std;
//本代码给出的是小根的笛卡尔树
int n;
int a[maxn];
int root; //存取根节点
int ls[maxn]; //存左孩子
int rs[maxn]; //存右孩子
vector<long long> v; //单调栈用
template<typename T>inline void read(T &ff) {
T rr = 1;
ff = 0;
register char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-')
rr = -1;
ch = getchar();
}
while (isdigit(ch)) {
ff = (ff << 1) + (ff << 3) + (ch ^ 48);
ch = getchar();
}
ff *= rr;
}
void build() {
for (register int i = 1; i <= n; i++) {
long long j = 0;
while (v.size() && a[v.back()] > a[i]) { //丹钓战操作
j = v.back();
v.pop_back();
}
if (!v.size())
root = i;
else
rs[v.back()] = i;
ls[i] = j;
v.push_back(i);
}
}
int main() {
// freopen("1.in", "r", stdin);
read(n);
for (register int i = 1; i <= n; i++) {
read(a[i]);
}
build();
long long ans1 = 0;
long long ans2 = 0;
for (register int i = 1; i <= n; i++) {
ans1 ^= 1ll * (i * (ls[i] + 1));
ans2 ^= 1ll * (i * (rs[i] + 1));
}
printf("%lld %lld", ans1, ans2);
return 0;
}