hdu 3954 Level up(线段树)
题目大意:N个英雄,M个等级,初始等级为1,给定每一个等级须要的经验值,Q次操作,操作分两种,W l r x:表示l~r之间的英雄每一个人杀了x个怪物;Q l r:表示询问l~r之间经验值最大的英雄经验值为多少。
每轮杀怪,每仅仅怪物的经验和当前等级成正比。
解题思路:线段树维护,每一个节点维护最大值,区间内还须要杀多少怪就能升级的最小值,假设这个最小值为0。就要将懒惰标记pushdown到最底层,将英雄升级。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10005;
const int INF = 0x3f3f3f3f;
int N, K, Q, need[15];
#define lson(x) ((x)<<1)
#define rson(x) (((x)<<1)|1)
int lc[maxn << 2], rc[maxn << 2], s[maxn << 2];
int ad[maxn << 2], nd[maxn << 2], rk[maxn << 2];
void maintain(int u, int d);
inline void pushup(int u) {
s[u] = max(s[lson(u)], s[rson(u)]);
rk[u] = max(rk[lson(u)], rk[rson(u)]);
nd[u] = min(nd[lson(u)], nd[rson(u)]);
}
inline void pushdown(int u) {
if (ad[u]) {
maintain(lson(u), ad[u]);
maintain(rson(u), ad[u]);
ad[u] = 0;
}
}
inline void levelup(int u) {
ad[u] = 0;
while (s[u] >= need[rk[u] + 1])
rk[u]++;
int tmp = need[rk[u] + 1] - s[u];
nd[u] = tmp / rk[u] + (tmp % rk[u] ? 1 : 0);
}
void maintain (int u, int d) {
nd[u] -= d;
ad[u] += d;
s[u] += rk[u] * d;
if (nd[u] <= 0) {
if (lc[u] == rc[u])
levelup(u);
else {
pushdown(u);
pushup(u);
}
}
}
void build (int u, int l, int r) {
lc[u] = l;
rc[u] = r;
s[u] = ad[u] = nd[u] = rk[u] = 0;
if (l == r) {
rk[u] = 1;
nd[u] = need[2];
return;
}
int mid = (l + r) / 2;
build(lson(u), l, mid);
build(rson(u), mid + 1, r);
pushup(u);
}
void modify (int u, int l, int r, int d) {
if (l <= lc[u] && rc[u] <= r) {
maintain(u, d);
return;
}
pushdown(u);
int mid = (lc[u] + rc[u]) / 2;
if (l <= mid)
modify(lson(u), l, r, d);
if (r > mid)
modify(rson(u), l, r, d);
pushup(u);
}
int query (int u, int l, int r) {
if (l <= lc[u] && rc[u] <= r)
return s[u];
pushdown(u);
int mid = (lc[u] + rc[u]) / 2, ret = 0;
if (l <= mid)
ret = max(ret, query(lson(u), l, r));
if (r > mid)
ret = max(ret, query(rson(u), l, r));
pushup(u);
return ret;
}
void init () {
scanf("%d%d%d", &N, &K, &Q);
for (int i = 2; i <= K; i++)
scanf("%d", &need[i]);
need[K+1] = INF;
build(1, 1, N);
}
int main () {
int cas;
scanf("%d", &cas);
for (int kcas = 1; kcas <= cas; kcas++) {
init();
printf("Case %d:\n", kcas);
char op[5];
int t, l, r;
while (Q--) {
scanf("%s%d%d", op, &l, &r);
if (op[0] == 'W') {
scanf("%d", &t);
modify(1, l, r, t);
} else
printf("%d\n", query(1, l, r));
}
printf("\n");
}
return 0;
}
hdu 3954 Level up(线段树)的更多相关文章
- HDU 3954 Level up(线段树)
HDU 3954 Level up 题目链接 题意:k个等级,n个英雄,每一个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,还有一个操作询问区间经验 ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- HDU 3954 Level up(多颗线段树+lazy操作)
又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...
- HDU 4107 Gangster(线段树 特殊懒惰标记)
两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...
- HDU 5091---Beam Cannon(线段树+扫描线)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- HDU 5820 (可持久化线段树)
Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...
随机推荐
- UGUI实现摇杆(模仿太极熊猫)
核心代码: using UnityEngine; using System.Collections; using UnityEngine.UI; public delegate void Joysti ...
- UITableView 自定义选中Cell颜色
cell.selectedBackgroundView = [[UIView alloc] initWithFrame:cell.frame]; cell.selectedBackgroundView ...
- Maxiee的Vim入门日记(4)——安装windows下的Cscope
Maxiee今天又学到了一个插件——Cscope.Cscope 是一款用于查看大型工程中的代码的软件.它使用方便,支持快速查找 C Symbol.function 等在工程中所有出现的位置,而不用自己 ...
- UVa 10256 The Great Divide,推断两个凸包是否相离
先从给出的两个点集中分别计算出两个凸包, 然后推断两个凸包是否相离. #include<cstdio> #include<vector> #include<cmath&g ...
- [HeadFirst-HTMLCSS学习笔记][第六章严格的HTML]
远古 古老的html 4.01和XHTML 1.1 页面 必须用Doctype挑明,再html元素上面 html 4.01 <!DOCTYPE html PUBLIC "-//W3C/ ...
- SQLServer 跨服务器查询的两个办法
网上搜了跨服务器查询的办法,大概就是Linked Server(预存连接方式并保证连接能力)和OpenDataSource(写在语句中,可移植性强).根据使用函数的不同,性能差别显而易见...虽然很简 ...
- MySQL 触发器的定义
-- Insert DELIMITER $$ USE `testdatabase`$$ DROP TRIGGER /*!50032 IF EXISTS */ `Trigger_XXX_INSERT`$ ...
- PagedList 分页
@using PagedList.Mvc;@model PagedList.IPagedList<MvcApplicationBootStramp.Models.Person> @{ ...
- ural 1297 Palindrome(Manacher模板题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 求最长回文子串. http://acm.timus.ru/problem.aspx ...
- Cleaning Shifts(POJ 2376 贪心)
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15143 Accepted: 3875 ...