比赛 2026.3.28 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 逆序排列 最终得分 100
用户昵称 终焉折枝 运行时间 2.549 s
代码语言 C++ 内存使用 20.24 MiB
提交时间 2026-03-28 10:28:22
显示代码纯文本
#include "inv.h"
#include <bits/stdc++.h>

const int MAXN = 2005;
int n, b[MAXN];
int a[MAXN], ans[MAXN];
int mp[MAXN][MAXN];

int ask(int l, int r){
    if(l >= r) return 0;
    if(~mp[l][r]){
        return mp[l][r];
    }
    int res = query(l, r);
    return mp[l][r] = res;
}

bool cmp(int l, int r){
    int op = ask(l, r) ^ ask(l + 1, r) ^ ask(l + 1, r - 1) ^ ask(l, r - 1);
    return op;
}

void init(int c, int t){
    
}

std::vector<int> solve(int n){
    std::vector<int> ans;
    for(int i = 1;i <= n;i ++){
        for(int j = 1;j <= n;j ++){
            if(j == i) mp[i][j] = 0;
            else mp[i][j] = -1;
        }
    }
    a[1] = 1;
    for(int i = 2;i <= n;i ++){
        int l = 1, r = i - 1, p = i;
        while(l <= r){
            int mid = (l + r) >> 1;
            if(cmp(a[mid], i)){
                p = mid;
                r = mid - 1;
            }
            else{
                l = mid + 1;
            }
        }
        for(int j = i;j > p;j --) a[j] = a[j - 1];
        a[p] = i;
        int cnt = 0;
        for(int j = 1;j <= i;j ++) b[a[j]] = j;
        for(int j = i - 1;j >= 1;j --){
            if(b[j] > b[i]) cnt ^= 1;
            mp[j][i] = cnt ^ mp[j][i - 1];
        }
    }
    for(int i = 1;i <= n;i ++) b[a[i]] = i;
    for(int i = 1;i <= n;i ++) ans.push_back(b[i]);
    return ans;
}