#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 非降。

输出

输出一行一个整数表示毁灭者一共吸收了多少法力。

样例输入

5
0 10 1
0 12 1
0 20 1
0 12 1
0 10 1
2
5 1 5
19 1 5
样例输出
83
Emacs Normal Vim
很明显是一个用线段树的题,每个节点中需要保存信息有:s初始法力,m最大法力上限,r每秒法力回复速度。由于每个单位的恢复值都不一样,所以要开不同的数组存放这些信息。首先建立整个线段树,把里面所有信息初始化,从区间[l,r]中进行查询,注意sum数组和其他数组之间并不是单纯的一对一联系,所以每次操作后要进行对应,即执行pushpu函数。
另外因为有输入时间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啊)

。。。。待补。。。。。。

#1034 : 毁灭者问题相关推荐

  1. 【BZOJ】1034: [ZJOI2008]泡泡堂BNB(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1034 弱的比弱的强就用,强的比强的强就用: 否则弱的和强的比. 输的情况就是2n-ans(b,a), ...

  2. Pat乙级 1034 有理数四则运算

    Pat乙级 1034 有理数四则运算 思路 代码 题目网址 https://pintia.cn/problem-sets/994805260223102976/problems/99480528762 ...

  3. 成功解决ValueError: Dimension 1 in both shapes must be equal, but are 1034 and 1024. Shapes are [100,103

    成功解决ValueError: Dimension 1 in both shapes must be equal, but are 1034 and 1024. Shapes are [100,103 ...

  4. [codevs 1034] 家园

    http://codevs.cn/problem/1034/ 题解: 按照时间建立分层图,建立超级源和超级汇,最大流量等于总人数时就退出. 代码: 错哪了呢? 状态: 运行错误(内存访问非法) Run ...

  5. PAT:1034 Head of a Gang (30分)

    1034 Head of a Gang (30分) One way that the police finds the head of a gang is to check people's phon ...

  6. 1034. 有理数四则运算(20)

    本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只 ...

  7. pat 甲级 1034. Head of a Gang (30)

    1034. Head of a Gang (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue One wa ...

  8. C++学习之路 | PTA乙级—— 1034 有理数四则运算 (20 分)(精简)

    1034 有理数四则运算 (20 分) 本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是 ...

  9. 信息学奥赛一本通 1034:计算三角形面积 | OpenJudge NOI 1.3 17

    [题目链接] ybt 1034:计算三角形面积 OpenJudge NOI 1.3 17:计算三角形面积 [题目考点] 1. 已知三点求三角形面积公式 已知三点分别为(x1,y1),(x2,y2),( ...

最新文章

  1. Google的系统工程师(SA)如何工作
  2. python连接服务器失败_python-查询期间失去与MySQL服务器的连接
  3. 利用Cydia Substrate进行Android HOOK(二)
  4. python 拟牛顿法 求非线性方程_9-非线性优化
  5. linux下文件下载中文,LINUX环境下资源下载中文目录及中文文件名称问题
  6. 如何把你的图标转换成WEB字体
  7. MySQL8 OCP 证书
  8. vecm模型怎么写系数_vecm(向量误差修正模型vecm)
  9. 计算机cpu架构是什么意思,「电脑小白必备」一分钟快速了解CPU
  10. openstack资料-陈沙克整理
  11. 支付宝等第三方支付原理与概述
  12. 前端工程筹建NodeJs+gulp+bower
  13. 腾讯T3大牛亲自讲解!面试字节跳动Android研发岗,值得收藏!
  14. matlab制动,地铁机车牵引制动模型
  15. centos 7 中文输入法的安装和启用
  16. Kubernetes和Mesos的区别和优缺点
  17. USB供电不足的解决办法
  18. MPU9250数据转换
  19. Visio导入Word可能出现的问题
  20. 【华为OD机试真题 Python】几何平均值最大的子数组

热门文章

  1. 墙面有几种装修方法_家里的墙面不知道怎么装?6种装饰方法任你选
  2. [PTA]实验11-2-7 统计专业人数
  3. java enum枚举类的用法以及高级玩法
  4. IDEA--字体大小设置
  5. Unity开发win10软件系列问题6: unity调用 win10 虚拟键盘tabtip.exe
  6. 什么是微信小程序【重点学习系列---干货十足--一文详解】
  7. 汇编语言寄存器AX,BX,CX,DX
  8. 软件设计师考试 | 第五章 软件工程基础知识 | 系统设计
  9. 关于互联网“毕业“的一些思考
  10. 【Adrealm智库专栏】数字广告为何需要“去中心化”?