当前位置: 首页 > news >正文

2025/10/20~2025/?/? 做题笔记 - sb

2025/10/20

AT_arc181_d Prefix Bubble Sort

很显然的有每一次交换都会恰好减少一个逆序对,于是题目转化为每次会产生多少次交换。

那么考虑如何统计交换次数

  • 发现当前缀 max 变化时不会产生答案,但是这个折线非常困难维护,不考虑这种做法
  • 考虑每个数往后交换多少次是难的,那么考虑有多少个数会往前交换。可以发现当前面有数大于这个数时,这个数一定会产生一次交换,那么直接统计有多少个数前面有大于它的数即可。由于题目限制了 \(A_i\) 单调不减,直接线段树简单维护即可

没有想到可以换一种贡献方式,老是在一棵树上吊死。

Code

#include <iostream>using namespace std;
using ll = long long;const int kN = 2e5 + 1;int n, m, a[kN];
ll ans;
struct BIT {int tr[kN];void Update(int x, int k) {for (; x < kN; x += x & -x)tr[x] += k;}int Query(int x) {int res = 0;for (; x; x -= x & -x)res += tr[x];return res;}
} Bit;
struct Point {int mn, cnt, tag;
} tr[kN << 2];void Func(int x, int k) {tr[x].mn += k, tr[x].tag += k;
}
void Pushdown(int x) {Func(x * 2, tr[x].tag), Func(x * 2 + 1, tr[x].tag), tr[x].tag = 0;
}
void Find(int x, int l, int r) {if (tr[x].mn > 0)return;if (l == r)return tr[x].mn = tr[x].tag = 1e9, tr[x].cnt = 0, void();Pushdown(x);int m = (l + r) / 2;Find(x * 2, l, m), Find(x * 2 + 1, m + 1, r);tr[x].mn = min(tr[x * 2].mn, tr[x * 2 + 1].mn), tr[x].cnt = tr[x * 2].cnt + tr[x * 2 + 1].cnt;
}
void Update(int nl, int nr, int x = 1, int l = 1, int r = n) {if (nl <= l && r <= nr)return Func(x, -1), Find(x, l, r);Pushdown(x);int m = (l + r) / 2;if (nl <= m)Update(nl, nr, x * 2, l, m);if (nr > m)Update(nl, nr, x * 2 + 1, m + 1, r);tr[x].mn = min(tr[x * 2].mn, tr[x * 2 + 1].mn), tr[x].cnt = tr[x * 2].cnt + tr[x * 2 + 1].cnt;
}
void Build(int x = 1, int l = 1, int r = n) {if (l == r)return tr[x].cnt = a[l] > 0, tr[x].mn = a[l] ? a[l] : 1e9, void();int m = (l + r) / 2;Build(x * 2, l, m), Build(x * 2 + 1, m + 1, r);tr[x].mn = min(tr[x * 2].mn, tr[x * 2 + 1].mn), tr[x].cnt = tr[x * 2].cnt + tr[x * 2 + 1].cnt;
}
int Query(int nl, int nr, int x = 1, int l = 1, int r = n) {if (nl <= l && r <= nr)return tr[x].cnt;Pushdown(x);int m = (l + r) / 2, res = 0;if (nl <= m)res = Query(nl, nr, x * 2, l, m);if (nr > m)res += Query(nl, nr, x * 2 + 1, m + 1, r);return res;
}int main() {
#ifndef ONLINE_JUDGEfreopen("in", "r", stdin);freopen("out", "w", stdout);
#endifcin.tie(0)->sync_with_stdio(0);cin >> n;for (int i = 1, x; i <= n; i++) {cin >> x;a[i] = Bit.Query(n - x + 1), Bit.Update(n - x + 1, 1), ans += a[i];}Build();cin >> m;for (int i = 1, x; i <= m; i++) {cin >> x;ans -= Query(1, x), Update(1, x);cout << ans << '\n';}return 0;
}

http://www.gsyq.cn/news/25719.html

相关文章:

  • ansible底层文件传输机制中默认模式遇到权限拒绝后启用管道模式可以得到解决
  • Android 源码解析系列1- Android init 进程启动流程
  • 2025.10.20总结
  • goframe框架命令行工具gf在zsh下不能用
  • 从18w到1600w播放量,我的一点思考。
  • 10.20java作业
  • 题解:Luogu P14175 【MX-X23-T5】向死存魏
  • 31_创蓝短信接入资料和定价
  • CSP-S 33
  • 10.20每日总结
  • 后缀树
  • CF1606E Arena 题解(动态规划)
  • 正睿 2025 NOIP20 连测 Day5 做题记录
  • CSP-S 20
  • Flutter应用设置插件 - 轻松打开iOS和Android系统设置
  • CSP-S 22
  • /usr/bin/sudo 二进制文件的权限有问题,导致所有用户都无法使用 sudo
  • CSP-S 19
  • 研1转码自学黑马程序员Python第7天 | Python函数知识 - 指南
  • 从C10K到Reactor:事件驱动,如何重塑高并发服务器的网络架构
  • 数据范围
  • CF2107E Ain and Apple Tree
  • 2025,为什么公众号编辑器排版决定阅读完成率?——一次从流程到结果的深评
  • P14262 [ROI 2015 Day1] 自动好友
  • win10 升级 win11 后时间更新失败
  • Hands on Deep Learning Chapter 3 线性神经网络
  • 超越技术范畴:低代码如何重塑企业数字文化
  • 详细介绍:1、手把手教你入门设计半桥LLC开关电源设计,LLC谐振腔器件计算
  • 十六天
  • 20251019