| 比赛 |
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;
}