【线段树】 hdu3954 Level up

宽带波束形成 介绍了宽带波束形成器的时域滤波结构,以及波束响应的计算公式,宽带波束形成器的波束响应可表示为权重向量和方向向量的积 阅读详情

Level up

http://acm.hdu.edu.cn/showproblem.php?pid=3954


Problem Description
Level up is the task of all online games. It's very boooooooooring. There is only level up in those games, except level up.
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.
 

Input
The first line is a number T(1<=T<=30), represents the number of case. The next T blocks follow each indicates a case.
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).
 

Output
For each case, output the number of case in first line.(as shown in the sample output)
For each query, output the maximum Exp from li to ri.
Output a black line after each case.
 

Sample Input
  
2 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
 

Sample Output
  
Case 1: 3 6 Case 2: 9 18 25


题意:每次会给[a,b]中的英雄加上ei*k(k为英雄的当前等级)的经验,同时英雄有了一定经验也会升级,问[a,b]中最大的经验是多少。

题解:maxx[i]表示等级为i的人的经验的最大值,那么我们就知道每个等级上是否有人的经验达到了升级条件,一旦有人达到就直接找到这个人,并将路径上的max[i]和max[i+1]的值更新一下即可。由于K比较小,每个人最多升级K次,而每次找一个人的复杂度是logN,所以升级操作总的复杂度是K*N*logN。


#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 10005
#define inf ((1<<30)-1)
//#define max(a,b) ((a)>(b)?(a):(b))
int max(int a,int b)
{
    return a>b?a:b;
}
int maxx[MAX<<2][11],add[MAX<<2],need[11];
int k;
void build(int l,int r,int idx)
{
    memset(maxx[idx],-1,sizeof(maxx[idx]));
    maxx[idx][1]=add[idx]=0;
    if(l==r) return;
    int mid=(l+r)>>1;
    build(l,mid,idx<<1);
    build(mid+1,r,idx<<1|1);
}
void push_up(int idx)
{
    for(int i=1; i<=k; ++i)
        maxx[idx][i]=max(maxx[idx<<1][i],maxx[idx<<1|1][i]);
}
void push_down(int idx)
{
    if(add[idx])
    {
        add[idx<<1]+=add[idx];
        add[idx<<1|1]+=add[idx];
        for(int i=1; i<=k; ++i)
        {
            if(maxx[idx<<1][i]!=-1)
                maxx[idx<<1][i]+=(i*add[idx]);
            if(maxx[idx<<1|1][i]!=-1)
                maxx[idx<<1|1][i]+=(i*add[idx]);
        }
        add[idx]=0;
    }
}
void change(int k,int l,int r,int idx)
{
    if(l==r)
    {
        maxx[idx][k+1]=maxx[idx][k];
        maxx[idx][k]=-1;
        return;
    }
    int mid=(l+r)>>1;
    push_down(idx);
    if(maxx[idx<<1][k]>=need[k])
        change(k,l,mid,idx<<1);
    else
        change(k,mid+1,r,idx<<1|1);
    maxx[idx][k]=max(maxx[idx<<1][k],maxx[idx<<1|1][k]);
    maxx[idx][k+1]=max(maxx[idx<<1][k+1],maxx[idx<<1|1][k+1]);
}
void update(int a,int b,int c,int l,int r,int idx)
{
    if(a<=l&&r<=b)
    {
        add[idx]+=c;
        for(int i=1; i<=k; ++i)
            if(maxx[idx][i]!=-1)
                maxx[idx][i]+=(i*c);
        for(int i=1; i<k; ++i)
            for(; maxx[idx][i]>=need[i];)
                change(i,l,r,idx);
        return;
    }
    push_down(idx);
    int mid=(l+r)>>1;
    if(a<=mid) update(a,b,c,l,mid,idx<<1);
    if(b>mid)  update(a,b,c,mid+1,r,idx<<1|1);
    push_up(idx);
}
int query(int a,int b,int l,int r,int idx)
{
    int ans=0;
    if(a<=l&&r<=b)
    {
        for(int i=k; i>0; --i)
            if(maxx[idx][i]!=-1)
            {
                ans=maxx[idx][i];
                break;
            }
        return ans;
    }
    push_down(idx);
    int mid=(l+r)>>1;
    if(a<=mid)
        ans=max(ans,query(a,b,l,mid,idx<<1));
    if(b>mid)
        ans=max(ans,query(a,b,mid+1,r,idx<<1|1));
    return ans;
}
inline void scan(int &n)
{
    char cc ;
    for(;cc=getchar(),cc<'0'||cc>'9';);
    n=cc-'0';
    for(;cc=getchar(),cc>='0'&&cc<='9';)
        n=n*10+cc-'0';
}
int main()
{
    int t,n,qw,a,b,c;
    char s[5];
    scanf("%d",&t);
    for(int tt=1; tt<=t; ++tt)
    {
        scanf("%d%d%d",&n,&k,&qw);
        for(int i=1; i<k; ++i)
            scanf("%d",&need[i]);
        need[k]=inf;
        build(1,n,1);
        printf("Case %d:\n",tt);
        for(; qw--;)
        {
            scanf("%s",s);
            if(s[0]=='W')
            {
                //scanf("%d%d%d",&a,&b,&c);
                scan(a);scan(b);scan(c);
                update(a,b,c,1,n,1);
            }
            else
            {
                //scanf("%d%d",&a,&b);
                scan(a);scan(b);
                printf("%d\n",query(a,b,1,n,1));
            }
        }
        puts("");
    }
    return 0;
}



Fluent温度超限调试:从能量方程到网格优化的实战指南 本文深入解析Fluent中温度超限问题的诊断与解决方法,从能量方程机制到网格优化策略,提供实战指南。通过分析温度与焓的换算关系,探讨典型场景如能量方程发散、局部网格质量差等,并给出五步调试法及高级命令应用,帮助工程师有效解决温度计算异常问题。 阅读详情

相关推荐

c语言版数据结构课程设计 学生成绩管理系统

此学生成绩管理系统完成15项功能,是我经过很多次的修改得到的。花费时间不短,功能齐全,主要完成了:输入,输出,插入,修改,删除,查询,读取文件,写入文件,复制文件,建立索引,显示各种情况下的信息,追加学生信息等等功能。一共15项。   代码如下: // shujujiegou.cpp : 定义控制台应用程序的入口点。///**本程序采用数组链表形式,原因:数组查询速度快,数组也能实现动态存储

Java 1万+

HDU - 5788 Level Up 主席树 + 树状数组

HDU - 5788 我们考虑把每个点遍历一遍, 把枚举的当前的这个点改成100000对答案的影响。 如果我们把 u 变成 100000, 受到影响的是 u 以及它的祖先, 我们记midu为子树u的中位数, nexmidu为子树u中位数的下一个数。 只有 a[ u ]的值小于等于祖先的mid, 才会改变祖先的薪水, 变成nexmidu。 所以我们用主席树求出每个子树的mid 和...

weixin_30266885的博客 199

centos8 安装新版bind9源码

bind一直在更新,使用了比较多的新架构 本文记录新版本的bind怎么安装,以及其依赖库的安装 1. 在https://www.isc.org/download/ 下载最新stable版本bind,本文以bind-9.17.9.tar.xz为例。将软件传到/root目录下。 也可以到https://ftp.isc.org/isc/bind9/ 下载更多历史版本 2. 安装基本的依赖库,像gcc、amake等 3. 需要安装libuv库,但直接用yum时可能安装不全 建议使用源码安装,需要安..

linggang_123的博客 2539

【HDU】3954 Level up

1 #include<cstdio> 2 #define MAXN 10010 3 #define MAXM 11 4 #define INF 2147483647 5 int n,k,need[MAXM]; 6 struct node 7 { 8 int big,lazy; 9 }; 10 node tree[MAX...

weixin_30587025的博客 88

手把手教你用Gazebo+ROS搭建智能小车机械臂系统(含完整配置文件)

本文提供了一份详细的实践指南,手把手教你使用Gazebo和ROS搭建智能小车机械臂仿真系统。内容涵盖从URDF/Xacro模型设计、Gazebo控制器配置到ROS话题通信与系统集成的完整流程,并提供了可复用的配置文件与调试技巧,帮助开发者快速构建并控制一个功能完备的移动操作机器人平台。

sugar的博客 972

Chapter 5 Gate Drivers and Level Shifters

Gate driver如下图所示, 包括功率管(带保护), Gate driver, Level shifter, Gate Supply 和Dead-time control.

2304_76736886的博客 2240

HDU 3954 Level up(线段树)

#include #include #include #include #include using namespace std; const int maxn = 10010; int t, n, k, qw; int need[11] = {0}; int maxexp[maxn<<2][11]; int add[maxn<<2]; void build(int l, int

~飞呀,飞~ 614

贝塞尔曲线原理--曲线生成--路径规划--matlab代码

贝塞尔曲线有着很多特殊的性质, 在图形设计和路径规划中应用都非常广泛, 在路径规划中贝塞尔曲线完全由其控制点决定其形状, n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制.

bob595078694的博客 1万+

HDU3954 - Level up

线段树 lazy标记 因为k很小所以我们可以维护k个等级下的最大经验

364

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 386

数学建模--十大经典常用算法

数学建模十大算法:灰色预测,蒙特卡洛,遗传算法,模拟退火法,组合算法,神经网络,动态规划,聚类算法,类比法,概率算法,Floyd算法

qq_51533426的博客 5647

hdu 3954(线段树的特殊lazy操作)

发现最巧妙的就是定义了最小升级系数dis,因为这个变量相当有用,但是又不容易想到(看来思维真的很重要)。。。 dis变量的定义,很好的将lazy结合起来了。就用简单的加减就很直观的转换。。 那么在有了这个变量之后,我们也就可以像一般线段树那样操作了。。 若当前lazy标记要更新,则传递给子树。。并把自己的lazy标记清空。。 若当前最大经验值大于升级的所需经验时就开始往下更新,直到不能更新

Weiguang_123的专栏 1929

Unreal 从入门到精通之VR常用操作

本文总结了使用Unreal5开发VR项目时遇到的常见问题及其解决方案。首先,介绍了如何通过VRPawn的TryTeleport函数设置玩家视角位置,确保头显移动时安全区域的正确传送。其次,详细说明了如何在Unreal中播放视频,包括导入视频文件、创建媒体播放器和媒体纹理,并将其应用到3D物体上。接着,讲解了如何播放VR全景视频,建议使用MediaPlate媒体板并调整几何体为球体。最后,讨论了如何手动打开和关闭VR模式,以便在PC模式和头显模式之间切换。这些方法为VR开发提供了实用的技术指导。

TxNet 952

HDU 3954 level up 线段树

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove   HDU 3954 level up http://acm.hdu.edu.cn/showproblem.php?pid=3954 HH的神题,想当初阿里巴巴这比赛是第一次参加的网上的比赛,还是组队的。结果被HH的一套神

窝不是爱酱,喵~~~~ 4026

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

hdu 3954 Level up· 线段树

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

Yubing792289314的博客 254

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

HDU 3954 Level up(线段树)

HDU 3954 Level up 题目链接 题意:k个等级,n个英雄,每个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,另一个操作询问区间经验最大值 思路:由于等级少,所以每个结点用Max[10]记录下每个等级的最大值,如果有一个升级就一直找到底,因为一个英雄升级最多10次,所以这个操作最多就10W次可以接受,剩下就是普通的区

Remilia's 1336

HDU 3954 level up (线段树)

题目链接 题目大意: 有n个角色,k个等级,q个询问。一开始所有角色经验为0,等级为1.可以执行两种操作。输入W l r e吧[l,r]区间内的角色经验都加上 等级*e,输入Q l r查询[l,r]区间内最大的经验值。 思路:看到题第一个想法就是维护区间内最大的等级和经验值,然后但会遇到这么一个问题,区间修改的时候肯定要打懒标记,但是如果在遍历线段树时要在一个已经打过标记的结点上再打标记,那么这时维护的信息是不正确的。因为你可能上次标记的时候这个区间的值已经变换,所获得的经验也会有变化,所以懒标记不可以直接

amazingee的博客 182

hdu 3954 level up 线段树区间维护

不绕弯子,线段树区间值维护。 每个区间应记录的值,lazy,val[12],val数组当中记录的是该区间当中每一个级数最大的经验值,如果此时经验值能够使得英雄升级,在一段区间当中有某个结点需要更新,此时我们如果用update操作的话,就要更新到最底层,那么此时线段树就没有意义,所以现在我们必须要控制一下, 只更新升级了的区间,那么我们就避免了更新一些不必要的点,因为当区间中的英雄级数不...

Andy20141210的博客 153

hdu 3954 Level up(线段树)

题目链接:hdu 3954 Level up 题目大意:N个英雄,M个等级,初始等级为1,给定每个等级需要的经验值,Q次操作,操作分两种,W l r x:表示l~r之间的英雄每个人杀了x个怪物;Q l r:表示询问l~r之间经验值最大的英雄经验值为多少。每轮杀怪,每只怪物的经验和当前等级成正比。 解题思路:线段树维护,每个节点维护最大值,区间内还需要杀多少怪就能升级的最小值,如果这个最

不慌不忙、不急不躁 1312

Level up 【HDU - 3954】【线段树+思维】

题目链接 不错的题呀,好几发才过,一开始的时候,我的想法是去查询是否整个区间都达到了等级K,然后都达到了等级K之后就是直接都不断的往上涨就是了——结局肯定是TLE,都不需要多想(但是我还是尝试了一发!)。 那么接下去怎么进行优化呢?上面的这个做法说明出了一个问题就是存在了过程中会有很高的复杂度,就是我们要去优化的是在每个等级时候的状态,不要看到就直接更新到叶子节点。于是乎就变成了怎样去...

既然弱小,就只顾变强就是了 240

hdu 3954 Level up(线段树进阶)

题意: 。。。 思路: 容易想到每个节点,需要维护,(最大exp,最大lev,tag)。 问题在于,区间内每个人的等级是不同的,不能统一维护。。 像exp[child] += lev[child] * tag[now]; tag[child] += tag[now]这样的代码只能够在区间内没人升级的时候正常工作。。 当前区间有人升级的时候,我们便跟新子区间,将他升级。 所以,我们在叶子

slowlight93的专栏 803

线段树 HDU3954 Level Up

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3954 代码风格:www.notonlysuccess.com 题目大意: 有n个人站一排,有m次操作,每个人最多可以到达k级,给出升级所需到达的经验 操作:w——【a,b】区间每个人都会获得(等级level * 经验k)的经验,q——求区间【a,b】内经验值最多的人有多少经验。 如果

ACmood 567

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

题目链接 题意: 给定一段区间 [1, n],每个点都有自身的 Level 值和 Exp 值; 进行若干次操作 W 和 Q, W L R e:给区间 [L, R] 的每个点增加一定的经验 exp = Level * e, 注意到每个点增加的经验值是不同的,与各自的等级成正比 Q L R:询问区间 [L, R] 内的最大经验值 maxExp 思考过程: 因为每个点增加的

kkkkahlua的博客 376

hdu 3954 Level up(线段树)

Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2976    Accepted Submission(s): 823 Problem Description Level up is the t

街角的花街糖 785

hdu 3954 Level up 线段树

Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3674    Accepted Submission(s): 994 Problem Description Level up is the t

G.D.Retop的专栏 625
上一篇: 【线段树】 hdu4107 Gangster
下一篇: 【转】常见23种设计模式
ACM_Ted
博客等级 码龄15年 122粉丝 208原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值