社区讨论

30分求调

P5854【模板】笛卡尔树参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjdccg4
此快照首次捕获于
2025/11/04 00:42
4 个月前
此快照最后确认于
2025/11/04 00:42
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 10100000;

int a[N], l[N], r[N];
int n;

void build() {
    stack<int> st;
    for (int i = 1; i <= n; i++) {
        l[i] = r[i] = 0;
    }
    for (int i = 1; i <= n; i++) {
        int last = 0;
        while (!st.empty() && a[st.top()] > a[i]) {
            last = st.top();
            st.pop();
        }
        if (!st.empty()) r[st.top()] = i;
        l[i] = last;
        st.push(i);
    }
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    build();
    ll ans = 0;
    for (int i = 1; i <= n; i++) ans ^= 1LL * i * (l[i] + 1);
    printf("%d ", ans);
    ans = 0;
    for (int i = 1; i <= n; i++) ans ^= 1LL * i * (r[i] + 1);
    printf("%d ", ans);
}

回复

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

正在加载回复...