hdu 3954 Level up 线段树 升级版Lazy tag 区间整体的性质

IPV6基本配置 IPV6配置,DHCPV6,华为模拟器,IPV6的M/O标志位 阅读详情

题目链接


题意:

给定一段区间 [1, n],每个点都有自身的 Level 值和 Exp 值;

进行若干次操作 W 和 Q,

W L R e:给区间 [L, R] 的每个点增加一定的经验 exp = Level * e, 注意到每个点增加的经验值是不同的,与各自的等级成正比

Q L R:询问区间 [L, R] 内的最大经验值 maxExp


思考过程:

因为每个点增加的经验值是不同的,所以很难直接对区间整体进行操作,所以像普通的 lazy tag 一样给区间整体的 sum 加上 val * len 的值,再给区间整体的 tag 加上 val 值是不可行的。而且 tag 还不能简单地叠加,因为也许这次操作完有一个点就升级了呢?而且向上 push_up 的话每一段区间的 Level 值 与 Exp 值也意义不明,毕竟每个点都不一样啊..........

于是一开始就傻乎乎地写成了单点修改,然后TLE不解释............


看了 http://blog.youkuaiyun.com/wsniyufang/article/details/6702560 后,豁然开朗


我们思考下放 tag 的条件:一旦该区间内有一个点升级,就下放 tag

再考虑 tag 的意义,tag 代表了一个区间整体的性质,这才使得整体的操作成为可能。

那么在这道题里,区间整体有什么性质呢?事实上,我们可以用 rem(ain) 记录每个点还差多少经验 e 即可升级,整个区间的 rem 取所有点的 rem 的最小值,一旦给这段区间加上的 exp 超过 rem 值,即下放 tag

那么如果这次操作不能使得这段区间的任何一个点升级呢?显然,我们不需要下放 tag,而是需要在现有的 tag 值上加上这次的 exp。再仔细想想,如果我下次恰好询问的就是该区间内的 maxExp 呢?那么按照我们写 query 的格式,会直接返回这一段的经验最大值。所以,这经验最大值不应该简简单单地只是每一次从下面 push 上来的整个区间内的 maxExp 这个数值(因为如果更新 exp 的途径只是从下面 push 上来,在这种情况下,返回的值就是没有更新过的旧值),而还应该具有其自身的含义——那就是这个区间内经验最大的那个点的经验值,即它要代表这个区间内经验最大的那个点。

好像说的是同一码事,事实上还是有差别的,如果其意义为 这个区间内经验最大的那个点的经验值,即它代表了这个区间内经验最大的那个点(同时也必然是等级最高的那个点),那么 对这一段整体经验值的增加 导致的 该段经验值最大的点的经验的增加 就直接可以通过 对该区间记录的 exp 值的修改反应出来。

总结一下我们上面说的,每个区间的 exp 与 lv 值就应该是该区间内 exp 值 最大的点的 exp 值 与 lv 值,它就完完全全地反应了作为了那个点的代言人存在。


这样一来,对于每种情况该如何处理也差不多清楚了,就可以写代码了............


AC代码如下:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define maxn 10010
#define lson (rt << 1)
#define rson (rt << 1 | 1)
typedef long long LL;
struct node {
    int l, r, lv, rem;
    LL exp, tag;
}tr[maxn * 4];
int ned[20], n, k, q, kas;
inline LL max(LL a, LL b) { return a > b ? a : b; }
inline int max(int a, int b) { return a > b ? a : b; }
inline int midi(int a, int b) { return (a + b) >> 1; }
inline int min(int a, int b) { return a < b ? a : b; }
void push_up(int rt) {
    tr[rt].exp = max(tr[lson].exp, tr[rson].exp);
    tr[rt].rem = min(tr[lson].rem, tr[rson].rem);
    tr[rt].lv = max(tr[lson].lv, tr[rson].lv);
}
void push_down(int rt) {
    if (tr[rt].tag) {
        tr[lson].exp += (LL)tr[lson].lv * tr[rt].tag;
        tr[rson].exp += (LL)tr[rson].lv * tr[rt].tag;
        tr[lson].rem -= tr[rt].tag; tr[rson].rem -= tr[rt].tag;
        tr[lson].tag += tr[rt].tag; tr[rson].tag += tr[rt].tag;
        tr[rt].tag = 0;
    }
}
void build(int rt, int l, int r) {
    tr[rt].l = l; tr[rt].r = r; tr[rt].exp = 0; tr[rt].tag = 0; tr[rt].lv = 0;
    if (l == r) {
        tr[rt].lv = 1;
        tr[rt].rem = ned[1] / 1;
        return;
    }
    int mid = midi(l, r);
    build(lson, l, mid);
    build(rson, mid + 1, r);
    push_up(rt);
}
void modify(int rt, int l, int r, int exp) {
    if (tr[rt].l == tr[rt].r) {
        tr[rt].exp += (LL)exp * tr[rt].lv;
        while (tr[rt].lv < k && tr[rt].exp >= ned[tr[rt].lv]) ++tr[rt].lv;
        if (tr[rt].lv == k) tr[rt].rem = inf;
        else tr[rt].rem = ceil((double)(ned[tr[rt].lv] - tr[rt].exp) / tr[rt].lv);
        return;
    }
    if (tr[rt].l == l && tr[rt].r == r) {
        if (tr[rt].rem > exp) {
            tr[rt].exp += tr[rt].lv * exp;
            tr[rt].tag += exp;
            tr[rt].rem -= exp;
            return;
        }
        push_down(rt);
        int mid = midi(l, r);
        modify(lson, l, mid, exp);
        modify(rson, mid + 1, r, exp);
        push_up(rt);
        return;
    }
    push_down(rt);
    int mid = midi(tr[rt].l, tr[rt].r);
    if (r <= mid) modify(lson, l, r, exp);
    else if (l > mid) modify(rson, l, r, exp);
    else { modify(lson, l, mid, exp); modify(rson, mid + 1, r, exp); }
    push_up(rt);
    return;
}
LL query(int rt, int l, int r) {
    if (tr[rt].l == l && tr[rt].r == r) return tr[rt].exp;
    push_down(rt);
    int mid = midi(tr[rt].l, tr[rt].r);
    if (r <= mid) return query(lson, l, r);
    else if (l > mid) return query(rson, l, r);
    else return max(query(lson, l, mid), query(rson, mid + 1, r));
}
void work() {
    printf("Case %d:\n", ++kas);
    scanf("%d%d%d", &n, &k, &q);
    for (int i = 1; i < k; ++i) scanf("%d", &ned[i]);
    build(1, 1, n);
    while (q--) {
        char ch;
        scanf("\n%c", &ch);
        int l, r, exp;
        if (ch == 'Q') {
            scanf("%d%d", &l, &r);
            printf("%lld\n", query(1, l, r));
        }
        else {
            scanf("%d%d%d", &l, &r, &exp);
            modify(1, l, r, exp);
        }
    }
    printf("\n");
}
int main() {
//    freopen("3954.in", "r", stdin);
    int T;
    scanf("%d", &T);
    while (T--) work();
    return 0;
}


【WSN定位】基于AOA算法实现目标无源定位附matlab代码 1 简介 2 部分代码 clear all; close all; clc;​stations = [0 0 0;20 0 0]; %基站位置​X = -100:100; %生成目标位置Y = X.*sin(X);Z = X+Y;N = length(X);Locations = zeros(N,3);angs = zeros(N,4);for i = 1:N angs(i,:) = Angs(stations*1e3,[X(i),Y(i),Z(i)]*1e3);end​for 阅读详情

相关推荐

国科大 雁栖湖校区 研一上 课程避坑与生存指南

本文为国科大雁栖湖校区研一新生提供全面的课程避坑与生存指南,涵盖选课策略、核心课程学习技巧、校园生活攻略及心态管理。重点解析算法设计与分析、人工智能原理等硬核课程的学习方法,并分享食堂、住宿、自习室等实用生存技巧,帮助新生高效适应研究生生活。

weixin_29304985的博客 301

hdu 3954 Level up· 线段树

题解 题意:一排n个1级英雄打怪兽吃经验升级,告诉你每个等级所需的经验值,升级不掉经验值,再给两个操作: W l r e每一波怪兽,派出[l,r]区间内的英雄去打,干掉这波怪兽,每个英雄可以获得 自身等级*e 点经验值 Q l r询问[l,r]区间内最高的经验值 很明显的线段树,但是更新好难啊… 看了别人的代码,现在来补补题, 由于每次获得经验都是跟英雄自身等级有关,要么暴力更新 不用尝试了,...

Yubing792289314的博客 253

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7136

hdu 3954 Level up(成段更新)

题意:有N个英雄,每个英雄的初始等级为1,初始经验为0,有K个等级,QW个操作。接下来一行中有K-1个数值,代表升到等级2,等级3……所要达到的经验。接下来的QW行里,每行是一个操作,操作有两类,(1)"l r e",代表区间[l,r]里的每个英雄将得到e乘以他的等级的经验。(2)"l r",表示查询区间[l,r]里经验最大值。         除了可以分成k棵线段树做之外,也可以合成一棵线段树

2398

中兴问天 BE7200MAX SFP 光口用华为猫棒替代光猫完整配置教程

PPPoE 账号密码:若原光猫为 Route 模式,在宽带设置页可见用户名,密码需按 F12 打开浏览器开发者模式,点击密码输入框,查看代码中 “value=” 后的内容即为明文密码。若仍失败,核对 PON 类型是否与运营商网络匹配。PON 认证信息:LOID(逻辑 ID,部分地区含密码)、设备 SN 码(标签或设备信息页)、PON 类型(GPON/EPON,运营商网络类型)。电脑保持与路由器连接,访问路由器管理地址(默认通常为 192.168.5.1,可参考路由器说明书),登录后台。

Gulper_Eel的博客 3335

DeepSeek-OCR又更新:一起看下OCR1和OCR2

DeepSeek-AI 最近又又开源了,这次是DeepSeek-OCR2,结合之前发布的DeepSeek-OCR ,可以发现DeepSeek走出了一条不同于主流 OCR 方案的技术路线。第一代模型探索了**“视觉作为文本压缩介质”的可行性,打破了传统的序列长度限制;第二代模型则通过“Visual Causal Flow(视觉因果流)”**架构,将因果推理引入视觉编码器,解决了复杂排版下的阅读顺序难题。本文将从架构设计、逻辑结构、训练范式及工程实现四个维度,深度剖析这两代模型的异同与创新。

kakaZhui的博客 623

HDU-3954:Level up(特殊的线段树成段更新)

HDU-3954:Level up 这也能用延迟更新系列? 线段树+延迟更新

污miao汪的博客 474

MCGS触摸屏Modbus TCP通讯实战:从寄存器写入到字符串处理的完整代码解析

本文详细解析了MCGS触摸屏通过Modbus TCP协议实现寄存器写入和字符串处理的完整代码,涵盖单寄存器写入、多寄存器写入及字符串传输等核心技术。文章还提供了MCGS组态环境中的实战配置步骤和常见问题排查方法,帮助开发者快速掌握工业自动化通讯的关键技术。

study的专栏 755

大语言模型推理能力提升:从思维链到专用模型的演进与实践

大语言模型(LLM)的推理能力是其从“鹦鹉学舌”迈向“思考者”的关键,也是通用人工智能(AGI)的核心支柱之一。其原理在于,当模型规模突破阈值后,会涌现出处理多步骤逻辑推导和符号操作的能力。为了系统性地提升这一能力,技术社区通过“策展”方式,如`atfortes/Awesome-LLM-Reasoning`项目,聚合了核心论文与技术路线。其技术价值在于,通过结构化方法将黑箱生成过程变得可追溯、可验证,从而直接提升代码生成、数学解题及复杂决策场景的可靠性。应用场景广泛覆盖从提示工程到专用模型训练的全链路。其中

weixin_30527423的博客 681

9.23华为OD机试真题 新系统 - 世界杯徽章换购 (Java/Py/C/C++/Js/Go)

9.23华为OD机试真题 新系统 - 世界杯徽章换购 (Java/Py/C/C++/Js/Go)

算法大师! 1591

计算机视觉与深度学习 | 2024年至2025年图像匹配算法总结(原理,公式,代码,开源链接)

以上总结覆盖了当前主流和前沿技术,实际选择需结合具体场景(速度/精度/资源限制)评估。

尘世冰封的专栏 1588

hdu 3954 Level up (线段树)

HH大神的神题。只能一直膜拜。。。 从线段树起步都是从他的博客里一点一滴的学的。 风格也是仿照他的来的。 然后说题目吧。 题目意思:会有很多波怪兽袭击,然后也有N个英雄。没来一波怪兽就派 编号是 L-R 的英雄去迎敌。 每个英雄都会获得一定的经验(既是   等级 *  每波的经验基数 E) 。最后Q操作就是问你  L-R 段中哪一个英雄的经验最高,并输出最高值。 开始的时候我有

Jinx Jinx again 943

SimpleITK使用——1. 进行Resample/Resize操作

文章目录1. 变换到一个新的spacing1.1 使用Resample()的方法1.1.1 完整代码1.1.2 转换前后图像1.2 使用ResampleImageFilter()的方法2. 已知原图和变换后目标图像的大小2.1 代码2.2 转换后图像3. 相关内容说明3.0 体素和spacing3.1 Resample() 函数说明3.2 itk::simple::ResampleImageFilter函数说明 1. 变换到一个新的spacing 1.1 使用Resample()的方法 1.1.1

啷个哩个啷 8081

HDU1698(线段树+区间覆盖+lazytag)

题目大意:给n个数,初始化为1,每次输入一个区间端点以及数字k,把这个区间的数全设为k。最后查询整个区间的数字和。 解题思路:线段树的裸题,区间更新区间查询,在打标记的时候直接赋值就行。 关于延迟标记 更新的时候如果发现某个区间在我们的更新区间之内,那么我们就把它的父节点更新完毕后,打个标记,表示该区间有一段任务未下放,将来用到其子区间时要完成下放的工作。然后直接结束该子树的更新任务。 Code...

小胡同的诗 285

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

hdu 3954 Level up

http://acm.hdu.edu.cn/showproblem.php?pid=3954 终于AC了,这个题目思路是没问题,但是我就是出现各种各样的细节错误,写线段树都有很多细节要注意的,尤其是带有延迟标记的线段树,各个变量之间数值的传递思路一定要清晰才行……  每个节点记录的变量:    level : 表示该节点表示区间中的点的最大等级    Max :  表示该节点表示区

态度决定高度 588

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

2017多校六 1002题 hdu 6097 Mindis 相似三角形 计算几何

题目链接 题意: 圆心 O 坐标(0, 0), 给定两点 P, Q(不在圆外),满足 PO = QO, 要在圆上找一点 D,使得 PD + QD 取到最小值。 官方题解: 做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r。 Q点同理。 极小化PD+QD可以转化为极小化P'D+Q'D。 当P'Q'与圆有交点时,答案为两点距离

kkkkahlua的博客 1668

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2017多校联合第三场 1005题 hdu 6060 RXD and dividing (超详细!!!)构造

题目链接 题意: 给定一棵 n 个节点的树,1 为根。现要将节点 2 ~ n 划分为 k 块,使得每一块与 根节点 形成的最小斯坦纳树的 边权值 总和最大。 看了题解之后的思考: 题解是:记有向边 (u, v) 长度为 w[v],以点 v 为根的子树的节点总数为 sz[v],那么答案就是 w[v] * min(sz[v], k) 对每个点求个和。 题解的说法是:可以通过构

kkkkahlua的博客 1071

HDU 3336 Count the string 所有前缀在串中的出现总次数

题目链接题意给定一个串 SS,求其所有前缀在其中的出现次数的总和。思路考虑 failfail 数组,fail[i]=jfail[i] = j 的含义是 S[0..j−1]==S[i−j..i−1]S[0..j-1] == S[i-j..i-1].记 dp[i]dp[i] 为以 ii 结尾的串中与前缀相同的串的个数。由 fail[i]=jfail[i] = j 有 S[0..j−1]==S[i−j..

kkkkahlua的博客 996

2017多校联合第二场 1009题 hdu 6053 TrickGCD (超详细!!!)莫比乌斯 容斥

题目链接 题意: Problem Description You are given an array A , and Zhu wants to know there are how many different array B satisfy the following conditions? * 1≤Bi≤Ai * For each pair( l ,

kkkkahlua的博客 898

2017多校八 1002题 hdu 6134 Battlestation Operational 艾弗森约定 莫比乌斯函数 分块

题目链接 题意: Your should calculate the total damage to the battlefield. Formally, you should compute f(n)=∑i=1n∑j=1i⌈ij⌉[(i,j)=1], where [(i,j)=1] evaluates to be 1 if gcd(i,j)=1,

kkkkahlua的博客 832

2017多校联合第一场 1006题 hdu 6038 Function 循环节

题目链接 题意: Please calculate the quantity of different functions f satisfying that f(i)=bf(ai) for each i from 0 to n−1. (嗯...就是这样) 思路: 首先可以将 a 数组划分成若干个循环节,每个节是相互独立的,取其中一个节来看,令其长度为 l

kkkkahlua的博客 805

2017多校四 1003题 hdu 6069 Counting Divisors 分解质因数

题目链接 参考:http://blog.youkuaiyun.com/protecteyesight/article/details/76685920  ——protecteyesight 题意: Problem Description In mathematics, the function d(n) denotes the number of divisors o

kkkkahlua的博客 689

2017多校九 05题 hdu 6165 FFF at Valentine 缩点 dp找最长链/拓扑排序

题目链接题意判定一个图是不是单向连通图。 // 其实就是poj 2186,不过poj的那道题数据水了些= = // 浏览题目时看成了FFT at Valentine吓死我= =思路先套路一发,tarjan求强联通分量,缩点,至此预处理完成。(这部分详细内容烦请移步本菜另一篇 强联通分量 缩点 tarjan 入门题小集) 然后怎么处理呢?法一现在我们得到了一个DAGDAG,直观想法就是有没有

kkkkahlua的博客 668

2017多校九 01题 HDU6161 Big binary tree 树形dp+hash

题目链接题意有一棵 nn (n≤1e8n\leq 1e8)个节点的完全二叉树,节点 ii 的父亲节点是 ⌊i2⌋\lfloor\frac{i}{2}\rfloor。初始时每个点的权值都是它本身。现有两种操作 mm 次(m≤1e5m\leq 1e5): 修改某个点的权值 询问 经过某个点的 权值和最大的 链 的权值和 思路dp[ ]dp[\ ] 记录从某个点向下走最长的链的权值和,修改即一路向上更新

kkkkahlua的博客 647

2017多校四 1005题 hdu 6071 Lazy Running 同余类 最短路

题目链接 题意: 给定一个环上的四个点1,2,3,4,距离分别为d12,d23,d34,d41,要求从2号点出发,最后回到2号点,要求经过的距离为大于等于 K 的最小值,求该最小值。 参考: 1. http://blog.youkuaiyun.com/blessLZH0108/article/details/76690027?locationNum=6&fps=1  ——Alzh

kkkkahlua的博客 638

2017多校联合第二场 1003题 hdu 6047 Maximum Sequence O(n) (有理有据地)贪心

题目链接 题意: an 和 bn 是两个长度为 n 的序列,其中保证 1 现要求根据 bn 来补全 an+1 ~ a2n 的数字,要求这一段和最大, 补全规则如下: 补 ai 时,从 bn 中不重复地挑选一个数字 bk, 要求 ai 思路: 我们看补全规则,就是在说从 ai 中下标为 bk 的地方起一直向后到现有的最后一个位置中,找一个 aj - j 的最大值

kkkkahlua的博客 630
上一篇: 2017多校联合第二场 1008题 hdu 6052 To my boyfriend 计数 单调队列
下一篇: 2017多校联合第三场 1005题 hdu 6060 RXD and dividing (超详细!!!)构造
kkkkahlua
博客等级 码龄12年 4粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值