hdu 3954 线段树 (标记)
Level up
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3973 Accepted Submission(s): 1104
In a online game, there are N heroes numbered id from 1 to N, each begins with level 1 and 0 Experience. They need to kill monsters to get Exp and level up.

There are many waves of monsters, each wave, the heroes with id from li to ri will come to kill monsters and those hero with level k will get ei*k Exp. If one hero's Exp reach Needk then the hero level up to level k immediately.
After some waves, I will query the maximum Exp from li to ri.
Now giving the information of each wave and Needk, please tell me the answer of my query.
The first line of each case contains three integers N(1<=N<=10000), K(2<=K<=10) and QW(1<=QW<=10000)each represent hero number, the MAX level and querys/waves number.
Then a line with K -1 integers, Need2, Need3...Needk.(1 <= Need2 < Need3 < ... < Needk <= 10000).
Then QW lines follow, each line start with 'W' contains three integers li ri ei (1<=li<=ri<=N , 1<=ei<=10000); each line start with 'Q' contains two integers li ri (1<=li<=ri<=N).
For each query, output the maximum Exp from li to ri.
Output a black line after each case.
3 3 5
1 2
W 1 1 1
W 1 2 1
Q 1 3
W 1 3 1
Q 1 3
5 5 8
2 10 15 16
W 5 5 9
W 3 4 5
W 1 1 2
W 2 3 2
Q 3 5
W 1 3 8
Q 1 2
Q 3 5
3
6
Case 2:
9
18
25
/*
hdu 3954 线段树 (标记) 给你n个人,然后打怪升级,如果当前人的等级为x,怪的经验为k,则这个人
可以得到x*k的经验。
然后k-1个数表示2-k即所需要的经验,假设你有leve[k]的经验,便能马上
升到k级。(最开始以为是k-1到k级要leve[k]的经验 TAT) 最开始只是记录的经验最大值MAX和add标记,然后更新最大值。
但是每次都要查找等级大小,感觉应该是TLE,但却一直WR.感觉很费解 然后借鉴了下别人的思路
新增了一个need和grade,即区间中升级所差经验的最小值,如果添加的经验小于
这个need,则更新这些标记即可.否则就找到那些需要升级的进行升级。 hhh-2016-03-22 22:48:41
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define lson (i<<1)
#define rson ((i<<1)|1)
typedef long long ll;
int n,qw;
int k;
const int maxn = 10010;
struct node
{
int l,r,grade;
int Max;
int add,need;
int mid()
{
return (l+r)>>1;
}
} tree[maxn*10];
int leve[15]; void push_up(int i)
{
tree[i].Max = max(tree[lson].Max,tree[rson].Max);
tree[i].grade = max(tree[lson].grade,tree[rson].grade);
tree[i].need = min(tree[lson].need,tree[rson].need);
} void fin_level(int cur)
{
for(int i = tree[cur].grade; i < k; i++)
{
if(tree[cur].Max >= leve[i])
tree[cur].grade = i+1;
}
} void build(int l,int r,int i)
{
tree[i].l = l;
tree[i].r = r;
tree[i].Max = tree[i].add = 0;
tree[i].need = leve[1];
tree[i].grade = 1;
if(l == r)
{
return ;
}
int mid = tree[i].mid();
build(l,mid,lson);
build(mid+1,r,rson);
push_up(i);
} void push_down(int i)
{
if(tree[i].add)
{
tree[lson].add += tree[i].add;
tree[rson].add += tree[i].add;
tree[lson].Max += tree[i].add*tree[lson].grade;
tree[rson].Max += tree[i].add*tree[rson].grade;
tree[lson].need -= tree[i].add;
tree[rson].need -= tree[i].add;
tree[i].add = 0;
}
} void Insert(int i,int l,int r,int val)
{
push_down(i);
int mid = tree[i].mid();
if(tree[i].l == tree[i].r)
{
tree[i].Max += val*tree[i].grade;
fin_level(i);
tree[i].need = (leve[tree[i].grade]-tree[i].Max)/(tree[i].grade)+
((leve[tree[i].grade]-tree[i].Max)%(tree[i].grade)!=0);
return ;
}
else if(tree[i].l >= l && tree[i].r <= r)
{
if(tree[i].need > val)
{
tree[i].add += val;
tree[i].need -= val;
tree[i].Max += (ll)val*tree[i].grade;
return ;
}
push_down(i);
if(l <= mid)Insert(lson,l,r,val);
if(r > mid)Insert(rson,l,r,val);
push_up(i);
return;
}
if(l <= mid)Insert(lson,l,r,val);
if(r > mid)Insert(rson,l,r,val);
push_up(i);
} int query(int i,int l,int r)
{
if(tree[i].l >= l && tree[i].r <= r)
{
return tree[i].Max;
}
push_down(i);
int ma = 0;
int mid = tree[i].mid(); if(l <= mid)
ma =max(ma,query(lson,l,r));
if(r > mid)
ma =max(ma,query(rson,l,r));
return ma;
} int main()
{
int T,cas = 1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&k,&qw);
for(int i = 1; i < k; i++)
scanf("%d",&leve[i]);
build(1,n,1);
leve[0] = 0; leve[k] = 1<<30;
char ch[4];
int l,r;
int val;
printf("Case %d:\n",cas++);
for(int i = 1; i <=qw; i++)
{
scanf("%s",ch);
if(ch[0] == 'Q')
{
scanf("%d%d",&l,&r);
ll ma = query(1,l,r);
printf("%I64d\n",ma);
}
if(ch[0] == 'W')
{
scanf("%d%d%d",&l,&r,&val);
Insert(1,l,r,val);
}
}
printf("\n");
}
return 0;
}
hdu 3954 线段树 (标记)的更多相关文章
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- git cherry-pick 整理
git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作.例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并, ...
- 我自己总结的C#开发命名规范整理了一份
我自己总结的C#开发命名规范整理了一份 标签: 开发规范文档标准语言 2014-06-27 22:58 3165人阅读 评论(1) 收藏 举报 分类: C#(39) 版权声明:本文为博主原创文章, ...
- php的打印sql语句的方法
echo M()->_sql(); 这样就可以调试当前生成的sql语句: //获取指定天的开始时间和结束时间 $datez="2016-05-12"; $t = strtot ...
- 阿里云API网关(18)请求报文和响应报文
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- Django之中间件
中间件简介 什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功 ...
- centos虚拟机nat模式,可以上内网,不能上外网
http://sky425509.iteye.com/blog/1996085 我这边的问题是,好久没用虚拟机了,重启之后,变成了dhcp模式,整个网卡配置变了. 重新配置了静态ip,网关,dns后才 ...
- SQL 中的日期和时间类型
在我们SQL中一般支持三种数据类型. date:日历日期,包括年(四位),月和日. time: 一天中的时间,包括小时,分和秒.可以用变量time(p)来表示秒的小数点后的数字位数(默认是0). 通过 ...
- yagmail让发邮件更简单
这是我迄今为止碰到的最良心的库,真tm简单啊 import yagmail # 连接邮箱服务器 yag = yagmail.SMTP(user="wuyongqiang2012@163.co ...
- Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...
- requests post一个json数据
# post一个json数据 import requests headers={ "Accept":"application/json, text/plain, */*& ...