Analysis
定义序列的全忠表示序列中逆序对的数量。
则给定序列 a a a,构造序列 b b b,其中 b i b_i bi为 0 或 1 0 或 1 0或1,使得 c i = a i + b i c_i = a_i+ b_i ci=ai+bi得出的 c c c序列权重最小。
首先分析 c i c_i ci,对于其而言,容易知道 c i c_i ci只可能取 a i a_i ai或 a i + 1 a_i + 1 ai+1,因为题目要求 c c c权重最小化,那么我们应该考虑如何使权重最小化:也就是什么时候+1才能使逆序对数量最小。
显然:如果 x x x 在 x + 1 x+1 x+1 的后面, 则我们把 x x x 这个数 + 1 +1 +1, x + 1 x+1 x+1 不变, 就能让逆序对减少 1 1 1。那么我们只需要统计逆序对的个数,按上述规则确定 B B B的 0 , 1 0 , 1 0,1取值:如果在前面的数改变之后还存在比它大 1 1 1的数,那么这个位置 B B B为 1 1 1,逆序对数减 1 1 1,统计逆序对个数可以归并,也可以树状数组等等。
AC Code
#include
#define int long long
#define mod 1000000007
#define N 100005
using namespace std;
int n, d, a1, a2, t, sum, tot;
int a[200005], c[200005], b[200005];
int lowbit(int x){ return x & -x; }
void add(int x){
while (x > n;
for (int i = 1; i > a[i];
sum += query(a[i]);
add(a[i]);
b[a[i]] = i;
}
sum = n * (n - 1) / 2 - sum;
t = 1;
while (t b[t + 1]) sum--, t += 2;
else t += 1;
}
cout
关注
打赏
- 回坑记之或许是退役赛季?
- [LCT刷题] P1501 [国家集训队]Tree II
- [LCT刷题] P2147 洞穴勘测
- 2022-2023 ICPC Brazil Subregional Programming Contest VP记录
- [线段树套单调栈] 2019-2020 ICPC Asia Hong Kong Regional Contest H.[Hold the Line]
- The 2021 ICPC Asia Nanjing Regional Contest E.Paimon Segment Tree 区间合并线段树/维护矩阵乘法
- CF580E - Kefa and Watch 线段树维护哈希
- HDU5869 Different GCD Subarray Query 离线查询/区间贡献
- 27.CF1004F Sonya and Bitwise OR 区间合并线段树
- 26.CF1000F One Occurrence