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 ...
随机推荐
- Linux学习--线程概念
线程 我们知道 ,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,本节我们学习如何在一个进程的地址空间中执行多个线程.有些情况需要在一个进程中同时执行多个控制流程,这 ...
- vue下拉列表
最近在弄作品,做了个下拉列表.心想各位小哥哥.小姐姐可能会用到相同的需求,就把下拉列表封装一下,希望能对各位小哥哥,小姐姐有帮助 github地址:https://github.com/ClmPisc ...
- .NET Core/.NET之Stream简介
之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core/.NET的Streams 首先需要知道, Syst ...
- EasyUI 修改 Messager 消息框大小
需求是要修改确认消息窗口的大小. 简单的调用方法是这样的: $.messager.confirm('操作确认', '确定批量编辑文章?', function (r) { ... } 这个时候生成的弹窗 ...
- linux 下 /bin /sbin 的区别
/bin,/sbin,/usr/bin,/usr/sbin区别 / : this is root directory root 用户根目录 /bin : command ...
- 【iOS】 含tableView的ViewController基类的实现
上篇博客写了ViewController的基类的实现,这篇博客主要写在BaseViewController的基础上实现一个含tableView控件的基类的实现,主要给包含tableView的页面来继承 ...
- Python中使用hashlib进行加密的简单使用
import hashlib ''' 原文= '字符串' 哈希加密对象 = hashlib.加密算法( 原文.encode('utf-8') ) 密文 = 哈希加密对象.hexdigest() #密文 ...
- Extensions in UWP Community Toolkit - SurfaceDialTextbox
概述 UWP Community Toolkit Extensions 中有一个为TextBox 提供的 SurfaceDial 扩展 - SurfaceDialTextbox,本篇我们结合代码详细讲 ...
- CentOS7 安装eclipse
1. 首先将eclipse的压缩包文件解压到/opt目录下,要使用root权限.执行如下解压命令:tar -zxvf eclipse-jee-oxygen-1a-linux-gtk-x86_64.ta ...
- Mybatis多个参数传值方法
第一种方案 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="s ...