题目链接: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(线段树)的更多相关文章

  1. HDU 3954 Level up(线段树)

    HDU 3954 Level up 题目链接 题意:k个等级,n个英雄,每一个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,还有一个操作询问区间经验 ...

  2. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  3. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  4. HDU 3954 Level up(多颗线段树+lazy操作)

    又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...

  5. HDU 4107 Gangster(线段树 特殊懒惰标记)

    两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...

  6. HDU 5091---Beam Cannon(线段树+扫描线)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...

  7. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  9. HDU 5820 (可持久化线段树)

    Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...

随机推荐

  1. Android学习总结——本地广播机制

    为了简单解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能在程序的内部进行传递,只能接受来自本应用程序发出的广播.否则当我们发送一些携带关键数据的广播可能被截获,一 ...

  2. [工作问题总结]MyEclipse 打开项目

    ------------------------------ASP.Net+Android+IO开发 .Net培训 期待与您交流!------------------------------ 1.项目 ...

  3. A10 平板开发二搭建Android开发环境

    我是直接在Ubuntu 12.10 64位系统下操作的,搭建Ubuntu开发环境类似,见Ubuntu 10.04开发环境配置.需要注意的是,64位的系统,需要安装支持32位的库(sudo apt-ge ...

  4. NPOI之使用EXCEL模板创建报表

    因为项目中要用到服务器端创建EXCEL模板 无法直接调用EXCEL 查了下发现NPOI很方便很简单就实现了 其中走了点弯路 第一次弄的时候发现输出的值是文本不是数字型无法直接计算公式 然后又发现打开报 ...

  5. JavaScript --------------继前面继承方式-------总结

    创建对象方式: 工厂模式:使用简单的函数创建对象,为对象添加属性和方法,然后返回对象: function createPerson(name,age,job){ var o = new Object( ...

  6. jquery滚动到指定元素,模仿锚点

    html <div class="pd-nav"> <div class="n-item active"> 保险服务 <i> ...

  7. php 二维码生成类

    <?php /** * BarcodeQR - Code QR Barcode Image Generator (PNG) * @package BarcodeQR * @category Ba ...

  8. iOS开发~视图(UIView)与控件(UIControl)

    1.UIView类 1.什么是视图 看得见的都是视图 2.什么是控件 一种特殊的视图,都是UIControl的子类,不仅具有一定的显示外观,还能响应高级事件,与用户交互.严格意义上UILabel不是控 ...

  9. (整理)ubuntu 的 相关知识(来自 鸟哥的私房菜)

    1. Linux 文件权限概念 $ ls 察看文件的指令 $ ls -al 出所有的文件详细的权限与属性 (包含隐藏档,就是文件名第一个字符为『 . 』的文件) 在你第一次以root身份登入Linux ...

  10. (转)最小二乘法拟合圆公式推导及vc实现[r]

    (下文内容为转载,不过已经不清楚原创的是哪里了,特此说明) 转自: http://www.cnblogs.com/dotLive/archive/2006/10/09/524633.html 该网址下 ...