icpc:problems:cf_1918_b
problems | |
---|---|
名称 | Minimize Inversions |
题目编号 | 1918B |
题目链接 | codeforces.com/… |
来源 | CodeForces |
算法分类 | 排序, 逆序对, 贪心 |
难易程度 | 容易 |
Minimize Inversions
想法
单独看任意一对$i,j$即$(a_i, a_j),(b_i, b_j)$,逆序对的数量为$0, 1, 2$。当两数交换时,会发生:
- 数量为0的对,交换后会产生2个逆序对
- 数量为1的对,交换后数量依旧为1
- 数量为2的对,交换后逆序对数量为0
调整的目的是减少逆序,故需要不动没有逆序的对,动有逆序的对。故将$a$序列直接排序,$a$序列中就不存在逆序对,对应的$b$序列中只会存在逆序对数量为$1$的数对。
代码实现
#include<cstdio> #include<algorithm> using namespace std; struct node { int a, b; }; bool cmp(node a, node b) { return a.a < b.a; } const int N = 2e5+10; node line[N]; int main() { int T; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); for(int i=1; i<=n; i++) scanf("%d", &line[i].a); for(int i=1; i<=n; i++) scanf("%d", &line[i].b); sort(line+1, line+1+n, cmp); for(int i=1; i<=n; i++) printf("%d%c", line[i].a, " \n"[i==n]); for(int i=1; i<=n; i++) printf("%d%c", line[i].b, " \n"[i==n]); } return 0; }
/app/www/public/data/pages/icpc/problems/cf_1918_b.txt · 最后更改: 2024/02/17 15:32 由 温婕莺