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

Codeforces Round 1096 G. Drowning 动态开点权值线段树

https://codeforces.com/contest/2227/problem/G

我们将使用拉马努金瞪眼法解决这一题:
注意到,我们需要求有多少个奇数长度的子数组,满足奇数位置设为 ,偶数位置设为 ,并且满足子数组的权值大于 \(0\)
证明注意到,每一个奇数长度的数组,最左边的和最右边的一定是正数,那么中间那一块肯定权值为负喽!
既然中间那一块权值为,那么对于中间那一块,最左边和最右边也肯定是正
然而这一整块为,那么最左边和最右边转化之后,就为
也就是说,偶数位置是!奇数位置是

要计算有多少个区间的权值是大于 \(0\) 的,有一个简单的方法,求前缀和
对于第 i 个位置的前缀 x,只用看前面有多少个数字是小于 x 的,那么这一段区间肯定是大于 \(0\) 的。
使用动态开点权值线段树解决即可!
特别注意,奇偶要分开判断:

\[[1,2,3,4] \]

如果取\([1,2,3]\),就是\([+1,-2,+3]\)
如果取\([2,3,4]\),就是\([+2,-3,+4]\)

证毕。
注意到,代码要写成这样:

#include <iostream>
#include <vector>using namespace std;const long long MIN_VAL = -1e15;
const long long MAX_VAL = 1e15;struct Node {int ls, rs;int cnt;
};// 全局线段树池
vector<Node> tree;int new_node() {tree.push_back({ 0, 0, 0 });return tree.size() - 1;
}void insert(int& p, long long l, long long r, long long val) {if (!p) p = new_node();tree[p].cnt++;if (l == r) return;// 负数区间完美向下取整的安全写法long long mid = l + (r - l) / 2;if (val <= mid) insert(tree[p].ls, l, mid, val);else insert(tree[p].rs, mid + 1, r, val);
}long long query(int p, long long l, long long r, long long ql, long long qr) {if (!p || ql > r || qr < l) return 0;if (ql <= l && r <= qr) return tree[p].cnt;long long mid = l + (r - l) / 2;long long res = 0;if (ql <= mid) res += query(tree[p].ls, l, mid, ql, qr);if (qr > mid) res += query(tree[p].rs, mid + 1, r, ql, qr);return res;
}void solve() {int n;cin >> n;// 【多测清空核心】// clear() 会将 size 设为 0,但不会释放已申请的 capacity(内存块还在)。// 这样避免了频繁的内存分配,速度极快!tree.clear();// 重新塞入 0 号节点作为“虚无节点”tree.push_back({ 0, 0, 0 });// rt[0] 存偶数位置前缀和,rt[1] 存奇数位置前缀和int rt[2] = { 0, 0 };long long S = 0;long long ans = 0;// 初始位置 0 是偶数,前缀和为 0insert(rt[0], MIN_VAL, MAX_VAL, 0);for (int i = 1; i <= n; ++i) {long long a;cin >> a;if (i % 2 == 1) {S += a;ans += query(rt[0], MIN_VAL, MAX_VAL, MIN_VAL, S - 1);insert(rt[1], MIN_VAL, MAX_VAL, S);}else {S -= a;ans += query(rt[1], MIN_VAL, MAX_VAL, S + 1, MAX_VAL);insert(rt[0], MIN_VAL, MAX_VAL, S);}}cout << ans << "\n";
}int main() {// 优化输入输出流(多测必备)ios_base::sync_with_stdio(false);cin.tie(NULL);// 预先分配一块较大内存(假设所有数据的 N 之和约为 2e5,每个元素约插入 60 层)// 这一步可以防止 vector 扩容时拷贝带来的卡顿tree.reserve(200000 * 62);int t;if (cin >> t) {while (t--) {solve();}}return 0;
}/*
⡀⠎⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣄⠃⠈⣶⡛⠿⠭⣉⠛⠿⡿⠛⠉⣀⣠⣤⣭⡏⠴⢀⣴⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿
⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣷⣱⣬⠛⠉⠀⠀⢠⠀⠀⠀⢀⣀⠀⠉⠿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠈⡿
⠀⠀⠀⠀⠀⠀⠀⢀⢿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠀⠀⠀⡏⠀⠀⠀⠀⠈⠳⠀⠀⠀⠻⣿⣿⣿⣿⣿⣿⠋⠀⣇⠀⠀⠀⠀⠀⠀⠀⠀⠈
⠀⠀⠀⠀⠀⠀⠀⣸⠀⣿⣿⣿⣿⠟⠀⠀⠀⠂⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⠈⡀⠀⠀⠀⠻⣿⣿⣿⣿⣷⡀⠘
⠀⠀⠀⠀⠀⠀⠀⣧⣿⣿⣿⣿⠋⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠙⣿⣿⣿⣿⣿⣄⣧
⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⣾⠀⠀⠀⠀⠀⠀⠀⠀⠀⢧⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣆
⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⢂⠻⣿⣿⣿⣿⣿⣄
⠀⠀⠀⠀⠀⣿⣿⣿⣿⣹⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠀⠀⠀⠀⠀⡄⠈⢿⣿⣿⣿⣿⣆
⠀⠀⠀⠀⣿⣿⣿⣿⠁⡇⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠐⠸⠀⠀⠻⣿⣿⣿⣆⢦
⠀⠀⢠⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⣼⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡏⣧⠀⠀⠀⠀⠐⣇⠀⠀⠙⣿⣿⣿⡄⠙⣄
⠀⣴⣿⣿⣿⣿⠏⠀⢸⠀⠀⠀⠀⠀⠀⡿⢿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣃⣈⣦⠀⠀⠀⠀⢹⠀⠀⠀⠸⣿⣿⣿⠀⠀⠳⣀
⠋⣸⣿⣿⣿⡟⠀⠀⠀⡆⠀⠀⠀⠀⠀⡏⠙⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠀⢠⠀⠀⠀⢧⠀⠀⠀⠀⡇⠀⠀⠀⠘⣿⣿⣷⠀⠀⠘
⠀⣿⣿⣿⢩⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⣀⠀⢱⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠂⢀⣴⣶⣿⣿⡀⠀⠀⢻⠀⠀⠀⠀⠹⣿⣿⡄
⢸⣿⣿⠃⠈⠀⠀⢸⠀⣿⣆⠀⠀⠀⠀⣿⣿⣿⠷⠘⡀⠀⠀⠀⠀⠀⠀⢠⢹⡀⠈⡿⠻⣿⣛⢿⣿⣷⡀⠈⠀⠀⠀⠀⠀⢻⣿⣿
⣿⣿⣿⠀⠀⠀⠀⢸⠀⡇⣼⣄⠀⠀⠀⢻⣿⡄⠑⠑⣿⡀⠀⠀⠀⢀⠀⠂⠇⠀⠀⠖⠛⢿⣿⣿⣌⢿⣿⣿⡆⠀⠀⠀⠀⠀⣿⣿⡀
⣿⣿⡇⠀⠀⠀⠀⢸⠀⣾⣿⣿⡷⠿⣷⣤⣿⣿⡄⠀⠀⠀⠑⠤⡀⠀⠃⠀⠀⠀⠀⣿⣶⣿⣿⣿⣿⣆⠙⣿⣧⠀⠀⠀⠀⠀⣿⣿⡇
⣿⣿⠁⠀⠀⠀⠀⠘⣾⣿⣿⠁⣴⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠸⡏⠙⣿⠉⠻⣿⠀⠀⣿⠀⠀⠀⣄⠀⣿⢸⣷
⣿⣿⡇⠀⠀⠀⠀⠀⣿⣿⠁⠀⣿⣿⠋⣿⠏⠙⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⠀⢀⢻⠀⠀⢀⡟⢀⣿⣸⢃⠟
⣿⣿⣿⠀⡄⠀⠀⠀⠘⠻⡄⠀⢹⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡘⠀⢀⣿⠃⣿⣿⡗⠁
⣧⣿⣿⣧⢹⡀⠀⠀⠀⠱⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀////⢀⠀⣴⣿⣿⣾⣿⣿⣿
⢿⠘⣿⣿⣿⣿⣤⠀⠢⡀⠱⠀⠀⠀⠀////⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣵⣿⣿⣿⣿⣿⣿⣿⣿⣷
⠀⠉⣿⣿⣿⡿⣿⠻⣷⣬⣓⣬⣄⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠉⠈⠈⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⠃⠼⢉⣿⣿⣿⣿⣿⣿⣿
⠀⠀⣿⣿⣿⣷⠀⠀⠀⠘⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⡏⠀⠀⢸⠀⢻⢿⣿⣿⡏⣿
⠀⢸⣿⣿⣿⣿⠀⠀⠀⠀⢻⣿⣿⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣾⣿⣿⣿⣿⠀⠀⠀⢸⠀⠀⢸⣿⣿⠘⡀
⢦⡿⣿⣿⣿⢿⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣶⣶⣦⡄⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠘⡄⠀⠈⣿⣿⡄⠱
⣴⠛⣾⣿⣿⢸⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⡄⠀⠀⠀⠀⠀⠀⠀⣯⠛⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⣇⠀⠀⣿⣿⣿
⠿⠀⣿⣿⣿⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⠟⠰⡾⠃⠀⠀⠀⠀⠀⠀⠀⠙⡟⠀⢻⣿⣿⣿⣿⣿⡆⠀⠀⠀⠸⠀⠀⠸⣿⣿⣷
⠆⢳⣿⣿⡇⠀⠀⠀⠀⠀⠀⣿⣿⣿⠛⠿⠿⢿⡟⠀⠀⠉⠦⣀⡤⢶⠀⠖⠲⠶⠊⠀⠀⠀⢻⡛⠛⠛⣿⣿⠀⠀⠀⠀⠃⠀⠀⢿⣿⣿
*/
http://www.jsqmd.com/news/805113/

相关文章:

  • 告别Rviz:用Web浏览器打造你的轻量级ROS 3D点云可视化工具(ROS3D.js实战)
  • 远程AI编程助手部署指南:基于Cursor CLI的控制平面实践
  • 管理APIKey与查看审计日志保障企业调用安全
  • 通用端口RAS技术:从传统拨号到多业务融合的演进
  • 厚街迷你仓哪家值得推荐:秒杀迷你仓品质保证 - 13724980961
  • Applite:macOS软件管理的终极GUI解决方案
  • MySQL数据库基础-2026-5-11-上五下两节课-索引
  • 意匠惨淡In Operation
  • 告别wgrib2!在Windows上直接用Python的xarray+cfgrib读取GRIB气象数据(附常见报错解决)
  • 如何掌握ComfyUI视频工作流:VideoHelperSuite完整配置指南
  • 从OpenMV 4P到STM32H743:借鉴思路,搞定MicroPython外扩SDRAM与QSPI Flash
  • 通过Nodejs调用Taotoken服务为视频项目批量生成描述文本
  • 哪个Claude API中转站有退款保障?从开发者风险控制角度看余额可退
  • 国产扭矩传感器靠谱品牌排行榜,广东犸力国货实力派稳居行业前列 - 品牌速递
  • AI量化交易框架实战:从模型训练到实盘部署全解析
  • 使用Arthas MCP对Java应用进行线上诊断实践
  • CST 2022学生版实战:手把手教你设计一个6GHz的Wi-Fi 6E矩形贴片天线
  • 告别安卓模拟器!3分钟学会在Windows上直接安装APK应用
  • 厚街吊车租赁哪家值得推荐:秒杀吊车租赁服务优质 - 17322238651
  • 从游戏开发到算法竞赛:三角形面积公式的跨界应用与Python实现
  • 2025最权威的六大AI学术网站推荐
  • 工业盘式扭矩传感器优质品牌哪家靠谱?广东犸力稳居品牌排行推荐首选 - 品牌速递
  • C++数据结构进阶|并查集(Union-Find)详解:从原理到面试实战
  • Koikatu HF Patch终极指南:5步解锁完整游戏体验与200+增强功能
  • AI智能体赋能投行级财务分析:四大模型实战与OpenClaw集成指南
  • PixelAnnotationTool完整指南:5分钟掌握智能图像标注技巧
  • Visual C++运行库一键修复:告别“应用程序无法启动“的终极解决方案
  • 音响系统维护维保
  • 从五管OTA到两级运放:在Cadence IC617中如何用gm/id法平衡性能、面积与功耗?
  • 在macOS上打造完美音乐伴侣:LyricsX歌词工具深度体验指南