最新要闻
- 进海南遭世纪大堵车 3小时挪300米?当地回应:前段时间轮渡停航
- 每日快讯!奥迪胜诉!蔚来在德国被禁止使用“ES6”、“ES8”等名称
- 世界快消息!卖8万能成爆款?比亚迪海鸥内饰谍照曝光:看齐大哥海豚
- 当前观察:担心的事发生了 滑雪游客乘坐缆车时坠落!官方回应
- 环球新资讯:谁能阻挡!比亚迪双线再“扩军”:产能新增或超百万辆
- 本故事纯属虚构是什么意思?本故事纯属虚构的下一句是什么?
- 尺子的刻度是什么意思?尺子的刻度是从几开始的?
- 社会发展的根本动力是什么?社会发展的源泉是什么?
- 肌底是什么意思?肌底液是干什么用的?
- 交通问题有哪些?交通问题反馈打什么电话?
- 忍不了!iPhone用户明确拒绝:苹果仍收集隐私数据 说好的正义呢?
- 荣耀新专利公布:反向无线充电有望进一步普及
- 要闻:需花1万1 保时捷为经典车提供最新车机:想用导航需再掏一笔
- 滚动:跟网易闹掰!暴雪禁止中国玩家参加《炉石传说》赛事
- 视点!极氪001全国首烧?车主洗了个澡 极氪001路边起火
- 世界观天下!比亚迪海豹获五星安全评价 因太过结实 反而在碰撞测试中被扣了分
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
数据结构:树状数组 学习笔记
树状数组
基本思想
树状数组是一种基于二进制拆分的思想,用来动态维护序列的前缀和的树形数据结构。在全国青少年信息学奥林匹克竞赛大纲内难度评级为 6,是提高级中开始学习的数据结构。
(资料图)
树状数组的基本操作:
- 修改序列中的一个数。
- 查询序列前缀和。
\(lowbit(x)\) 表示将 x 写成二进制表示后,最低位的 1 所代表的数值,如 \(10 = (1010)_2 , lowbit(10)=(10)_2=2\)
以下是 \(lowbit(x)\) 的求法,具体证明可参见 《算法竞赛进阶指南》 0x01 二进制 章节。
#define lowbit(x) ((x)&(-(x)))
对于原序列 \(a[n]\),树状数组用一个数组 \(c[n]\),其中,\(c[i]\) 表示以 \(i\) 结尾长度为 \(lowbit(i)\) 的区间和,即区间 \([i-lowbit(i)+1,i]\)。
这时如果把整个数组视作一个树型结构(如下图,图来自《算法竞赛进阶指南》),则有以下性质:
- 每个节点表示以这个节点为根的子树中所有节点的和。
- 每个节点有 \(lowbit(i)\) 个子节点,其中 \(i\) 表示这个节点的编号。
- 每个节点的父节点是 \(i+lowbit(i)\),其中 \(i\) 表示这个节点的编号。
可以发现,树的深度是 \(O(\log n)\),所以树状数组的两种基本操作的时间复杂度都是 \(O(\log n)\)。
代码实现
洛谷 P3374 【模板】树状数组 1
a[n]
表示原序列,c[n]
表示树状数组,其中 n
是序列长度。
#include #include using namespace std;const int N = 5e5 + 5;int c[N], n;#define lowbit(x) ((x)&(-(x)))inline void add(int id, int x) { for (int i = id;i <= n;i += lowbit(i)) c[i] += x;}inline int query(int id) { int ans = 0; for (int i = id;i > 0;i -= lowbit(i)) ans += c[i]; return ans;}inline int query(int l, int r) { // 前缀和思想求区间和 return query(r) - query(l - 1);}signed main() { int m; ios::sync_with_stdio(false); cin >> n >> m; for (int i = 1;i <= n;i++) { int a;cin >> a; add(i, a); } for (int i = 1;i <= m;i++) { int op, x, y; cin >> op >> x >> y; if (op == 1) add(x, y); else cout << query(x, y) << endl; } return 0;}
树状数组与逆序对
如果把树状数组当作一个桶使用,则可以用树状数组进行求逆序对等操作。具体地,因为树状数组可以查询前缀和,所以可以查询比某个数小的数量,据此可统计逆序对数目。
洛谷 P1908 逆序对
注意:此题值域较大,需要对数据进行离散化。
参考代码:
// https://www.luogu.com.cn/problem/P1908#include #include using namespace std;const int N = 5e5 + 5;int n,a[N], // 原序列b[N], m, // 离散化用序列c[N]; // 树状数组(当桶使用)long long ans;#define lowbit(x) ((x)&(-(x)))void add(int id, int x) { for (int i = id; i <= n; i += lowbit(i)) c[i] += x;}int sum(int id) { int ans = 0; for (int i = id;i;i -= lowbit(i)) ans += c[i]; return ans;}int query(int x) { return lower_bound(b + 1, b + 1 + n, x) - b;}signed main() { ios::sync_with_stdio(0); #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin);freopen("data.out", "w", stdout); #endif cin >> n; for (int i = 1;i <= n;i++) { cin >> a[i]; b[i] = a[i]; } sort(b + 1, b + 1 + n); m = unique(b + 1, b + 1 + n) - b - 1; for (int i = 1;i <= n;i++) a[i] = query(a[i]); for (int i = n;i;i--) { ans += sum(a[i] - 1); add(a[i], 1); } cout << ans << endl;}
如果再对当桶使用的树状数组进行拓展,即权值树状数组,可实现一些平衡树的操作,见拓展阅读。
树状数组与差分
朴素的前缀和区间查询和单点修改的时间复杂度分别是 \(O(1)\), \(O(n)\)。树状数组可以将其优化为 \(O(\log n)\),\(O(\log n)\)。朴素的差分单点查询和区间修改的时间复杂度分别是 \(O(n)\), \(O(1)\)。树状数组同样可以将其优化为 \(O(\log n)\),\(O(\log n)\)。
代码实现如下:
洛谷 P3368 【模板】树状数组 2
#include #include using namespace std;const int N = 5e5 + 5;int a[N], c[N], n;inline int lowbit(int x) { return x & (-x); }inline void add(int id, int x) { for (int i = id;i <= n;i += lowbit(i)) c[i] += x;}void add(int l, int r, int x) { add(l, x), add(r + 1, -x);}inline int query(int id) { int ans = 0; for (int i = id;i > 0;i -= lowbit(i)) ans += c[i]; return ans;}signed main() { int m; ios::sync_with_stdio(false); cin >> n >> m; for (int i = 1;i <= n;i++) cin >> a[i]; for (int i = 1;i <= n;i++) { if (i == 1) add(1, a[1]); else add(i, a[i] - a[i - 1]); // 差分 } for (int i = 1;i <= m;i++) { int op, x; cin >> op; if (op == 1) { int y, k; cin >> x >> y >> k; add(x, y, k); } else cin >> x, cout << query(x) << endl; } return 0;}
考虑区间查询,有:\(\sum_{i=1}^x a[i]\)而差分(\(b[i]\)是差分数组)有: \(a[i]=\sum_{j=1}^i b[i]\)考虑每一个 \(b[i]\) 被求和的次数(如图,图来自《算法竞赛进阶指南》),化简一下式子:
\[\sum_{i=1}^x \sum_{j=1}^i b[i] = \sum_{i=1}^x (x-i+1) * b[i] = \sum_{i=1}^x (x+1) *b[i] - i*b[i] = \newline (x+1) \sum_{i=1}^x b[i] - \sum_{i=1}^x i*b[i]\]用树状数组分别维护 \(b[i]\) 和 \(i*b[i]\) 即可维护上面式子,区间查询和区间修改的时间复杂度都是 \(O(\log n)\)。
代码实现如下:
LibreOJ #132. 树状数组 3 :区间修改,区间查询
// https://loj.ac/p/132#include using namespace std;#define lowbit(x) ((x)&(-(x)))#define int long longconst int N = 1e6 + 5;int a[N]; // 原数组int b[N]; // 差分数组int c[3][N], n; // 树状数组,c[1]维护b[i],c[2]维护i*b[i] void add(int k, int id, int x) { for (int i = id;i <= n;i += lowbit(i)) c[k][i] += x;}void add(int k, int l, int r, int x) { if (k == 1) add(k, l, x), add(k, r + 1, -x); else add(k, l, l * x), add(k, r + 1, -(r + 1) * x);}int query(int k, int id) { int ans = 0; if (k > 0) { for (int i = id;i;i -= lowbit(i)) ans += c[k][i]; return ans; } return (id + 1) * query(1, id) - query(2, id);}int query(int k, int l, int r) { return query(k, r) - query(k, l - 1);}signed main() { ios::sync_with_stdio(0); #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif int q; cin >> n >> q; for (int i = 1;i <= n;i++) { cin >> a[i]; b[i] = a[i] - a[i - 1]; } for (int i = 1;i <= n;i++) { add(1, i, b[i]); add(2, i, i * b[i]); } while (q--) { int op; cin >> op; if (op == 1) { int l, r, x; cin >> l >> r >> x; add(1, l, r, x); add(2, l, r, x); } else { int l, r; cin >> l >> r; cout << query(0, l, r) << endl; } } return 0;}
参考资料 && 拓展阅读 && 推荐题目
- 《算法竞赛进阶指南》,李煜东著,0x42 树状数组
- AcWing 算法提高课 4.2 树状数组
- 洛谷日报 #416 [5k_sync_closer] 浅谈权值树状数组及其扩展
- AcWing 241. 楼兰图腾 提示:树状数组求逆序对+组合计数
- AcWing 244. 谜一样的牛 提示:树状数组+二分/倍增
- AcWing 260. 买票
- 洛谷题单 CMの树状数组
数据结构:树状数组 学习笔记
环球观热点:Downie V4.6.4 for Mac 视频下载工具
进海南遭世纪大堵车 3小时挪300米?当地回应:前段时间轮渡停航
每日快讯!奥迪胜诉!蔚来在德国被禁止使用“ES6”、“ES8”等名称
世界快消息!卖8万能成爆款?比亚迪海鸥内饰谍照曝光:看齐大哥海豚
当前观察:担心的事发生了 滑雪游客乘坐缆车时坠落!官方回应
环球新资讯:谁能阻挡!比亚迪双线再“扩军”:产能新增或超百万辆
本故事纯属虚构是什么意思?本故事纯属虚构的下一句是什么?
尺子的刻度是什么意思?尺子的刻度是从几开始的?
社会发展的根本动力是什么?社会发展的源泉是什么?
肌底是什么意思?肌底液是干什么用的?
交通问题有哪些?交通问题反馈打什么电话?
ceb文件怎么打开?ceb文件怎么转换成PDF?
水电煤气费一个月大约多少钱?微信怎么交水电煤气费?
华为荣耀3c多少钱一部?华为荣耀3c手机参数
电脑主机噪音大是什么原因?电脑主机噪音大怎么解决?
投影仪灯泡使用寿命是多久?投影仪灯泡机和激光机哪个好?
忍不了!iPhone用户明确拒绝:苹果仍收集隐私数据 说好的正义呢?
荣耀新专利公布:反向无线充电有望进一步普及
要闻:需花1万1 保时捷为经典车提供最新车机:想用导航需再掏一笔
滚动:跟网易闹掰!暴雪禁止中国玩家参加《炉石传说》赛事
视点!极氪001全国首烧?车主洗了个澡 极氪001路边起火
PowerShell 美化(oh-my-posh)
全球聚焦:截图工具,QQ截图独立版,可以脱离QQ使用的QQ截图小工具,有人把QQ截图功能单独拆出来了,真的很好用!
播报:学习笔记——SpringMVC处理响应数据;SpringMVC处理请求域响应乱码问题
世界观天下!比亚迪海豹获五星安全评价 因太过结实 反而在碰撞测试中被扣了分
天天快报!吴京谈《流浪地球2》:效果震撼到起鸡皮疙瘩
天天视点!特斯拉为何敢打价格战? 分析:单车利润是丰田汽车四倍
卢伟冰:Redmi K60系列越卖越好 霸榜2500-4000元价位段
热点评!0排放 有史以来最大的氢电动飞机首飞:19座、飞了10分钟
SICTF2023 web_wp
环球快看:读函数式编程思维笔记01_演化的语言
【报资讯】印度越南做备胎算了吧!苹果永远离不开中国制造 未来20年中国主宰科技生产
环球热门:近30年来日本男性越长越矮!东京大学研究:我们矮小身高更有利生存
欧盟向TikTok CEO发出通牒:不尽快遵守欧盟法规或被封禁
明晚见!央视《2023年春节联欢晚会》已完成全部五次彩排
Redmi Note 12系列在印度一周卖出30亿卢比 创下销售纪录
要闻速递:岳云鹏主持河南春晚出现“笑场” 网友喊话郭德纲扣工资
2022年出货量暴跌!PC越来越凉了:但CPU、显卡持续涨价
南宁兔子灯被吐槽羊不羊兔不兔火了 表情被网友收藏:“打工人”写照
世界热议:顺丰单票收入是“三通一达”6倍 纠纷不断 寄丢万元iPhone只赔1千
环球实时:暴雪中国:1月24日正式停服 玩家数据安全网易负责
焦点快播:学习笔记——@PathVariable注解基本使用;@PathVariable注解属性;REST风格CRUD概述;实现PUT&DELETE提交方法步骤
环球短讯!Codeforces Round #753 (Div. 3)(ABCDE)
世界热点!node.js安装
天天日报丨超117万人想看!《流浪地球2》预售票房破亿:大年初一上映
天天新资讯:告别LCD+侧边指纹!曝Redmi Note新品拥抱OLED+屏幕指纹
女记者被裁员去海底捞打工:赚钱更多了 不敢告诉家人
世界要闻:憋出大招的电车 可能会剥夺油车最后的尊严
NVIDIA史上最鸡肋、还特长寿的显卡:GeForce MX终于要走了!
全球焦点![数据结构] 栈 (C语言)
【世界速看料】动物园老虎被3只狮子围攻撕咬 官方回应“越界”导致:为何要同区饲养?
吴京谈《流浪地球2》:努力为自己的角色增加光彩
全球热消息:OPPO Find N2成为老外眼中最好的折叠屏手机!三星落后其两代
环球热点!AcWing1081. 度的数量
通讯!DVWA靶场实战(八)——SQL Injection(Blind)
团购低人一等?男子理发耳朵被剪掉一块肉:店方求网友高抬贵手
2025年前后!嫦娥六号将为人类取回月球背面第一批月壤
联想启天M540c/M450c商用机对比评测:酷睿版配置/性能完胜
卡梅隆:在家看《阿凡达2》要有大电视 别在手机上看
当前短讯!对比飞天茅台 花8万块测市面多款白酒:结果不出所料
【新视野】没人买!机械硬盘出货量惨遭腰斩 稳定性/性价比都输SSD
世界观速讯丨深度根植!苹果永远都不能完全离开中国制造
今日热闻!男子疑因抽烟错过高铁跪地求开门:科普正确补救方法
三星Galaxy S23系列美版定价泄露:Ultra版卖8000多元 向苹果看齐
【新视野】联想Tab P11 5G安卓平板将在国内上市:骁龙750G处理器
观速讯丨曾言获10万订单:零跑C01变相降价2.5万
【全球新要闻】韩国电动车基金不重仓特斯拉了!基金经理感叹:坑太多
【全球速看料】dubbo实战篇:dubbo超时设置
头条焦点:RTX 4090 16针电源线又烧了!加强版“躺平”也不行
今亮点!低脂高蛋白 鲨鱼菲特鸡胸肉:5袋到手14.9元
当前热点-安卓碎片化一地鸡毛:发布5个月后 仅5.2%用户升级Android 13
天天关注:大红灯笼挂满街头认不出红绿灯?官方回应:已调整 交通违法误判可撤销
每日讯息!男子网购耐克鞋收到两只左脚 商家拒绝提供售后
当前滚动:树状数组笔记整理
今日快看!排队5小时、日营业额过万!春节前美甲生意火了
比新车还香!极氪推出官方二手车:三电终身质保
【独家焦点】或将对标《原神》!《王者荣耀·世界》即将发布新实机演示
环球微速讯:学习笔记——@RequestMapping注解位置、注解属性;@RequestMapping支持Ant风格的路径
每日短讯:吃完饭车没了 男子怀疑被偷报警:结果忘拉手刹车溜进沟
我国第二款国产ECMO获批上市!航天火箭技术转化:完全自主知识产权
微头条丨定了!2023高考全国统考时间公布:6月7日开考
世界看热讯:曾两次感染新冠!辉瑞CEO:正研发可保护一年的新冠疫苗
环球焦点!SpaceX星际飞船超级重型助推器本周测试:33部猛禽发动机同时点火
天天观速讯丨【网关开发】5.Openresty 自定义负载均衡与流量转发
观点:100w人在线的 弹幕 系统,是怎么架构的?
焦点热议:年轻人的第一台影像旗舰!卢伟冰:Redmi Note 12 Pro系列绝对可以
天天观速讯丨东北大哥8小时狂炫40斤砂糖橘 网友提醒:当心变黄
全球报道:《魔兽世界》国服即将停运!最后一周超7千帐号开挂被封
世界看热讯:近千亿国产半导体公司卓胜微净利润暴降超50%:大家确实不爱换手机!你换没
全球速读:呆萌!66只考拉七代同堂齐送新春祝福
全球播报:非对称加解密算法SM2
世界简讯:从合并石子学区间DP
环球快播:Golang的基本数据类型-基本使用
不是安卓!鸿蒙系统成大学教材 “鸿蒙之父”王成录参与 培养开发者
焦点热议:美国科技史上最大规模裁员开启:亚马逊、微软“毕业”均超万人
全球快播:25年历史的笔记本内存将被淘汰 新标准单条可达128GB 频率更快
环球最新:24年前经典重现!《轩辕剑叁:云和山的彼端》将推出Switch版本
世界微动态丨三亚已成全国最堵城市:国人扎堆去海南 能堵到你哭泣
焦点精选!零下30度 东北司机穿10斤棉裤冒雪下乡送年货:网友为劳动者正能量点赞