hdu 3954 Level up(线段树)

简介:

题目链接: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;
}







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5233571.html,如需转载请自行联系原作者
相关文章
|
存储 算法 前端开发
Java——使用Map还是实体类?
Java——使用Map还是实体类?
|
数据可视化 虚拟化 图形学
Autocad软件2018版本下载安装教程——全版本安装包获取教程
Autocad软件2018版本下载安装教程——全版本安装包获取教程
848 0
|
测试技术 C语言
wrk(2)- Lua 脚本的使用
wrk(2)- Lua 脚本的使用
1067 0
wrk(2)- Lua 脚本的使用
|
4月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
263 23
|
JavaScript 前端开发 Java
【程序员小白入门】这几个宝藏菜鸟教程网站记得收藏!!!
其实菜鸟教程相关的网站内容都大同小异,推荐这几个原因是页面交互比较简单,重要的是没有任何广告。
|
弹性计算 负载均衡 Kubernetes
你所不了解的 Traefik
在之前的文章中,我们简单介绍了关于 Traefik 的相关概念及组件原理机制,具体可参考:为什么选择 Traefik Ingress ?
516 0
Linux--shell中获取字符串长度的常用方法
Linux--shell中获取字符串长度的常用方法
|
JavaScript
[✔️]cmake command 无法使用通配符匹配文件,只能检索下目录指定文件
[✔️]cmake command 无法使用通配符匹配文件,只能检索下目录指定文件
399 0
|
网络协议 网络架构
什么是 ICMP ?ping和ICMP之间有啥关系?
Internet 控制消息协议 (ICMP) 是 TCP/IP 的实用协议,负责提供有关 TCP/IP 网络上的设备、服务或路由的可用性的信息,大多数网络故障排除技术和工具都以常见的 ICMP 消息类型为中心,最著名的就是ping,主要用于测试设备之间的通信。
1067 0
什么是 ICMP ?ping和ICMP之间有啥关系?