HDU 1698 Just a Hook——区间更新的线段树
来源:互联网 发布:微信软文制作软件 编辑:程序博客网 时间:2024/06/11 10:15
题意:一开始有n个1组成的数列,执行q此操作,每次操作给出x y z,表示把区间【x,y】内的所有数变成z,执行完q此操作后求整个数列的和
思路:直接套用区间更新线段树的模板,进行简单的更新值与求和操作
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1e5 + 10;int T, n, q, date[maxn], segTree[maxn<<2], lazy[maxn<<2];void init() { for (int i = 1; i <= n; i++) { date[i] = 1; } for (int i = 1; i <= n<<2; i++) { segTree[i] = 0; lazy[i] = 0; }}void pushup(int root) { segTree[root] = segTree[root<<1] + segTree[root<<1|1];}void pushdown(int root, int cntL, int cntR) { if (lazy[root]) { lazy[root<<1] = lazy[root]; lazy[root<<1|1] = lazy[root]; segTree[root<<1] = lazy[root] * cntL; segTree[root<<1|1] = lazy[root] * cntR; lazy[root] = 0; }}void build(int L, int R, int root) { if (L == R) { segTree[root] = date[L]; return; } int mid = (L + R)>>1; build(L, mid, root<<1); build(mid + 1, R, root<<1|1); pushup(root);}void update_interval(int L, int R, int root, int uL, int uR, int val) { if (uL <= L && R <= uR) { segTree[root] = val * (R - L + 1); lazy[root] = val; return; } int mid = (L + R)>>1; pushdown(root, mid - L + 1, R - mid); if (uL <= mid) { update_interval(L, mid, root<<1, uL, uR, val); } if (uR > mid) { update_interval(mid + 1, R, root<<1|1, uL, uR, val); } pushup(root);}int query(int L, int R, int root, int qL, int qR) { if (qL <= L && R <= qR) { return segTree[root]; } int mid = (L + R)>>1; pushdown(root, mid - L + 1, R - mid); int ans = 0; if (qL <= mid) { ans += query(L, mid, root<<1, qL, qR); } if (qR > mid) { ans += query(mid + 1, R, root<<1|1, qL, qR); } return ans;}int main(){ scanf("%d", &T); for (int kase = 1; kase <= T; kase++) { scanf("%d%d", &n, &q); init(); build(1, n, 1); while (q--) { int a, b, c; scanf("%d %d %d", &a, &b, &c); update_interval(1, n, 1, a, b, c); } printf("Case %d: The total value of the hook is %d.\n", kase, query(1, n, 1, 1, n)); } return 0;}
阅读全文
1 0
- HDU 1698 Just a Hook【线段树—区间更新】
- HDU 1698 Just a Hook——区间更新的线段树
- 线段树(区间更新与区间查询)——Just a Hook ( HDU 1698 )
- HDU 1698 Just a Hook 线段树区间更新
- 线段树(区间更新) hdu-1698-Just a Hook
- hdu 1698(区间更新线段树)Just a Hook
- hdu 1698 Just a Hook(线段树-区间更新)
- hdu 1698 Just a Hook 线段树区间更新
- HDU 1698 Just a Hook (线段树区间更新)
- HDU-1698-Just a Hook(线段树 区间更新)
- HDU 1698 Just a Hook (线段树区间更新)
- hdu 1698 Just a Hook 线段树区间更新
- HDU 1698 Just a Hook(线段树区间更新)
- HDU 1698 Just a Hook (线段树区间更新)
- HDU 1698 Just a Hook(线段树区间更新)
- HDU 1698 Just a Hook // 线段树 区间更新
- [HDU 1698]Just a Hook[线段树区间更新]
- hdu 1698 Just a Hook 线段树区间更新
- appium for windows 10的安装及环境搭配
- 2017 Multi-University Training Contest 5 solutions BY 吉如一
- NSRunLoop的退出方式
- 在Jenkins上创建Job并进行配置,发布,详细见《Jenkins 创建 job》
- 生产者消费者模型[多生产者-多消费者模式]
- HDU 1698 Just a Hook——区间更新的线段树
- Python学习笔记(二)-- 变量类型 + 运算符
- C语言fopen 错误
- mysql分表和表分区详解
- mysql数据库的主从复制
- 关于MarkDownPad2报--Awesomium.Windows.Controls.WebControl'....错误
- 流程图及其写文档工具
- React Native使用Mobx总结
- 关于MONTE CARLO TREE SEARCH提前应该知道的