hdu 1698 线段树 区间更新
2015-08-04 15:26
141 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1698
题意:在Dota游戏中,有一个名叫pudge的怪物。
他有一条大铁钩子,又许多小铁钩子组成。
Pudge有两种技能可以把从L到R区间的小钩子变成金钩或银钩子,来增加他钩子的价值
L R num(1,2,3) 1是铁 2是银 3是金
经过M次操作后,问大钩子的价值。
做法:线段树区间更新,用sum来维护区间的价值总和
最后询问一次(1,n)即可
题意:在Dota游戏中,有一个名叫pudge的怪物。
他有一条大铁钩子,又许多小铁钩子组成。
Pudge有两种技能可以把从L到R区间的小钩子变成金钩或银钩子,来增加他钩子的价值
L R num(1,2,3) 1是铁 2是银 3是金
经过M次操作后,问大钩子的价值。
做法:线段树区间更新,用sum来维护区间的价值总和
最后询问一次(1,n)即可
#include <set> #include <map> #include <queue> #include <stack> #include <deque> #include <math.h> #include <string> #include <vector> #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <functional> #define mem(a) memset(a,0,sizeof(a)); #define mem_1(a) memset(a,-1,sizeof(a)); #define sf(a) scanf("%d",&a) #define sff(a,b) scanf("%d%d",&a,&b) #define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c) #define LL long long #define lson l, mid, root<<1 #define rson mid+1, r, root<<1|1 const int INF = 0x7FFFFFFF; const int MAXN = 100100; const double PI = acos(-1.0); const double esp = 1e-10; using namespace std; struct node { int lazy; int l,r,sum; }Tree[MAXN << 2]; void build_tree(int l, int r,int root) { Tree[root].l = l; Tree[root].r = r; Tree[root].lazy = 0; if(r==l) { Tree[root].sum = 1; return ; } int mid = (l+r) >> 1; build_tree(l,mid,root << 1); build_tree(mid+1,r,root << 1|1); Tree[root].sum = Tree[root<<1].sum + Tree[root<<1|1].sum; } void updata(int l,int r,int root,int k) { if(Tree[root].l == l && r == Tree[root].r) { Tree[root].sum = k * ( r - l + 1); Tree[root].lazy = k; return ; } if(Tree[root].lazy > 0) { Tree[root << 1].lazy = Tree[root].lazy; Tree[root << 1].sum = (Tree[root<<1].r - Tree[root << 1].l+1) * Tree[root].lazy; Tree[root << 1|1].lazy = Tree[root].lazy; Tree[root << 1|1].sum = (Tree[root<<1|1].r - Tree[root << 1|1].l+1) * Tree[root].lazy; Tree[root].lazy = 0; } int mid = (Tree[root].l + Tree[root].r) >> 1; if(r <= mid) updata(l,r,root << 1,k); else if( mid < l) updata(l,r,root<<1|1,k); else { updata(l,mid,root << 1,k); updata(mid+1,r,root<<1|1,k); } Tree[root].sum = Tree[root<<1].sum + Tree[root <<1|1].sum; } int main() { int T,n,m,l,r,k,times=1; sf(T); while(T--) { sf(n); build_tree(1,n,1); sf(m); while(m--) { sfff(l,r,k); updata(l,r,1,k); } printf("Case %d: The total value of the hook is %d.\n",times++,Tree[1].sum); } return 0; }
相关文章推荐
- 使用 Jtest:一款优秀的 Java 代码优化和测试工具
- iOS编程-XCode Debug忽略SIGPIPE信号
- 杂谈_如何让VS2013开发的MFC程序运行在XP系统下
- 图片上添加文字
- 单buffer,双buffer和三buffer的区别
- 博客免责声明
- iOS 中KVC、KVO、NSNotification、delegate 总结及区别
- Android 基础 笔记
- BootStrap 管理系统框架选择
- XCode6.3编写swift+OC引入含C++的库时的问题
- 让页面底部固定
- hdu1754 单点更新
- leetcode Factorial Trailing Zeroes非负整数阶乘后尾0个数
- WordPress主题 Music Pro 高级音乐/电台自适应主题[更新至v1.0]
- android studio 工具
- 极光推送Jpush功能(具体参照官网说明文档,注意此文红色字体)
- python 多线程处理List
- dSploitzANTI渗透教程之修改MAC地址与Wifi监听器
- 开发的某条delete报错
- 9.3栈和队列(四)——堆盘子