CF1579E2 Array Optimization by Deque
CF1579E2
原题链接←Click it
题目大意:给定一个数组,依次将中的每个元素放到一个双端队列中,求逆序对可能的最小值。
解题思路:首先对于,从前端插入和从尾端插入效果都是一样的。那么无论是前端插入还是后端插入,都要考虑到,依次类推,对于任意,都必须考虑,那么就可以贪心地插入,如果在前端的逆序对数量少就插在前端,反之就差在尾端。因此就可以构建一颗平衡树,里面存放的是队列中已有元素的个数,每次可以用的复杂度求出插入前端和插入尾端的逆序对个数。
参考代码:
struct BIT {
int N;
vector<int> c;
BIT (int n) : N(n) {
c.resize(n + 1, 0);
}
void add(int x, int d) {
for(;x <= N; x += x & -x) {
c[x] += d;
}
}
int sum(int x) {
int res = 0;
for(;x; x -= x & -x) {
res += c[x];
}
return res ;
}
int sum(int x, int y) {
return sum(y) - sum(x);
}
};
void solve() {
int n;
cin >> n;
vector<int> a(n);
for(int i = 0; i < n; i ++) {
cin >> a[i];
}
vector<int> b = a;
sort(b.begin(), b.end());
b.resize(unique(b.begin(), b.end()) - b.begin());
for(int i = 0; i < n; i ++) {
a[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin() + 1;
}
int cnt = b.size();
ll res = 0;
BIT bit(cnt);
for(int i = 0; i < n; i ++) {
res += min(bit.sum(a[i] - 1), bit.sum(a[i], cnt));
bit.add(a[i], 1);
}
cout << res << '\n';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现