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 ...
随机推荐
- iOS开发UIKit框架-可视化编程-XIB
1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...
- C简单实现双向链表
<pre name="code" class="cpp">//链表结构 typedef struct DulNode { DataType data ...
- Python内置函数(8)——bool
英文文档: class bool([x]) Return a Boolean value, i.e. one of True or False. x is converted using the st ...
- OAuth2.0学习(1-8) 授权方式五之Access_Token令牌过期更新
OAuth2.0的Access_Token令牌过期更新 如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌. 客户端发 ...
- ssh整合之七注解结合xml形式
1.我们之前的纯xml的方式,我们的配置文件很多,我们可以使用注解结合xml的方式进行开发,这样的话,我们的配置文件,会少很多,同时,我们可以直接在类中看到配置,这样,我们就可以快速地搭建一个ssh整 ...
- ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查
介绍 EntityFrameworkCore EF core 是一个轻量级的,可扩展的EF的跨平台版本.对于EF而言 EF core 包含许多提升和新特性,同时 EF core 是一个全新的代码库,并 ...
- hive:导出数据记录中null被替换为\n的解决方案
在hive中,一般情况下通过 use my_hive_db; set hive.merge.mapfiles=true; set hive.merge.mapredfiles=true; ; ; in ...
- Django(博客系统):重写了auth.User后使用createsupperuser出错解决办法
背景:重写django的系统User后,使用createsupperuser创建用户失败 由于项目需要扩展django默认新的auth.User系统(添加两个字段:头像.简介等字段),因此就重写了dj ...
- POJ-1679 The Unique MST---判断最小生成树是否唯一
题目链接: https://vjudge.net/problem/POJ-1679 题目大意: 给定一个无向连通网,判断最小生成树是否唯一. 思路: (1)对图中的每条边,扫描其他边,如果存在相同权值 ...
- scrapy爬取极客学院全部课程
# -*- coding: utf-8 -*- # scrapy爬取极客学院全部课程 import scrapy from pyquery import PyQuery as pq from jike ...