#1034 : 毁灭者问题
来源:互联网 发布:win7电脑连接网络 编辑:程序博客网 时间:2024/05/01 18:37
#1034 : 毁灭者问题
时间限制:10000ms单点时限:1000ms内存限制:256MB描述
在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位。
毁灭者的核心技能之一,叫做魔法吸收(Absorb Mana):
现在让我们来考虑下面的问题:
假设你拥有 n 个魔法单位,他们从左到有站在一行,编号从 1 到 n。 每个单位拥有三项属性:
si: 初始法力。
mi: 最大法力上限。
ri: 每秒中法力回复速度。
现在你操纵一个毁灭者,有 m 个操作,t l r,表示时刻 t,毁灭者对所有编号从 l 到 r 的单位,使用了魔法吸收。操作按照时间顺序给出,计算毁灭者一共吸收了多少法力。
输入
输入数据的第一行有一个整数 n(1 ≤ n ≤105) — 你的魔法单位的数目。
接下来的 n 行,每行有三个整数 si, mi, ri(0 ≤ si ≤ mi ≤ 105, 0 ≤ ri ≤ 105) 描述一个魔法单位。
接下来一行又一个整数 m(1 ≤ m ≤ 105), — 操作的数目。
接下来的 m 行,每行描述一个操作 t, l, r(0 ≤ t ≤ 109, 1 ≤ l ≤ r ≤ n),t 非降。
输出
输出一行一个整数表示毁灭者一共吸收了多少法力。
- 样例输入
50 10 10 12 10 20 10 12 10 10 125 1 519 1 5
- 样例输出
83
#1034 : 毁灭者问题
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
si: 初始法力。
mi: 最大法力上限。
ri: 每秒中法力回复速度。
- 样例输入
50 10 10 12 10 20 10 12 10 10 125 1 519 1 5
- 样例输出
83
描述
在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位。
毁灭者的核心技能之一,叫做魔法吸收(Absorb Mana):
现在让我们来考虑下面的问题:
假设你拥有 n 个魔法单位,他们从左到有站在一行,编号从 1 到 n。 每个单位拥有三项属性:
现在你操纵一个毁灭者,有 m 个操作,t l r,表示时刻 t,毁灭者对所有编号从 l 到 r 的单位,使用了魔法吸收。操作按照时间顺序给出,计算毁灭者一共吸收了多少法力。
输入
输入数据的第一行有一个整数 n(1 ≤ n ≤105) — 你的魔法单位的数目。
接下来的 n 行,每行有三个整数 si, mi, ri(0 ≤ si ≤ mi ≤ 105, 0 ≤ ri ≤ 105) 描述一个魔法单位。
接下来一行又一个整数 m(1 ≤ m ≤ 105), — 操作的数目。
接下来的 m 行,每行描述一个操作 t, l, r(0 ≤ t ≤ 109, 1 ≤ l ≤ r ≤ n),t 非降。
输出
输出一行一个整数表示毁灭者一共吸收了多少法力。
另外因为有输入时间T作参数,数据的及时更新也是不可缺少的。
一些小细节注意。及时清空,计算时候一些对时间的优化做好了就可以了。
TLE:(超时代码。。。)#include <iostream>#include <cstdio>#include <cstring>using namespace std;int sum[100010<<2];int m[100000],ri[100000],t[100010<<2];const long long MOD=1000000007;void pushup(int root){sum[root]=sum[root<<1]+sum[root<<1|1];}void build(int l,int r,int root){if(r==l){scanf("%d%d%d",&sum[root],&m[l],&ri[l]);t[l]=0;return ;}int mid=(l+r)>>1;build(l,mid,root<<1);build(mid+1,r,root<<1|1);pushup(root);}void recover(int time,int L,int R,int l,int r,int root){if(l==r&&(l>=L&&l<=R)){int temp=(time-t[l])*ri[l];if(sum[root]+temp>m[l]) sum[root]=m[l];else sum[root]+=temp;return ;}int mid=(l+r)>>1;if(L<=mid) recover(time,L,R,l,mid,root<<1);if(R>mid) recover(time,L,R,mid+1,r,root<<1|1);pushup(root);}long long query(int L,int R,int l,int r,int root){if(L<=l&&R>=r) return sum[root];int mid=(l+r)>>1;long long ans=0;if(L<=mid) ans=query(L,R,l,mid,root<<1);if(R>mid) ans+=query(L,R,mid+1,r,root<<1|1);return ans;}void clea(int time,int L,int R,int l,int r,int root){if(l==r&&(l>=L&&l<=R)){t[l]=time;sum[root]=0;return ;}int mid=(l+r)>>1;if(L<=mid) clea(time,L,R,l,mid,root<<1);if(R>mid) clea(time,L,R,mid+1,r,root<<1|1);pushup(root);}int main(){int n;memset(t,0,sizeof(t));scanf("%d",&n);build(1,n,1);int tm;scanf("%d",&tm);long long ans=0;for(int i=1;i<=tm;i++){int time,l,r;scanf("%d%d%d",&time,&l,&r);recover(time,l,r,1,n,1);ans=(ans+query(l,r,1,n,1))%MOD;clea(time,l,r,1,n,1);}printf("%lld",ans);return 0;}补充:
如果魔法单位没有法力上限,这道题就是一道水题了,线段树即可搞定。
但设置了法力上限,从维护区间角度来考虑就比较难了。。。。。(线段树TLE啊)
。。。。待补。。。。。。
1 0
- #1034 : 毁灭者问题
- hiho 1034 毁灭者问题(treap)
- 初识splay tree ( hihocoder #1034 : 毁灭者问题 题解)
- [难]hihocoder 线段树 毁灭者问题
- 毁灭
- 毁灭
- 毁灭
- Facebook的毁灭者---HTML5!
- 谁是中国移动互联网创新的毁灭者
- 人工智能:人类潜在的毁灭者吗
- 人工智能:人类潜在的毁灭者吗
- 互联网将遭遇"千年虫"式问题 30年后或毁灭
- 中国字头的公司,都是财富毁灭者
- 炫龙毁灭者P6如何重装win7系统操作?
- 人工智能毁灭世界的逻辑中存在着什么样的问题?
- 解密全球最牛实战评测 网络毁灭者来华传道
- 炫龙毁灭者DDPro笔记本bios设置u盘启动教程
- 《意志的毁灭》
- C#求三角形的周长和面积
- Codeforces 545 C Woodcutters(贪心/DP)
- 网上出名IT技术网站整理
- 程序人生-001-写程序我骄傲
- Linux常用基础指令记录
- #1034 : 毁灭者问题
- 如何学习C语言
- 进阶配置你的vim为c++IDE
- 堆和栈的区别(转过无数次的文章)
- Python机器学习实战(二)--决策树
- Java并发:volatile内存可见性和指令重排
- 网站建设(1)——域名的类型、选择和购买
- lightoj - 1027 - A Dangerous Maze - dp / 概率dp
- PE 512