http://blog.csdn.net/acm_cxlove/article/details/7548087

感觉最巧的是定义了min_dis……将区间内有无英雄升级分开处理

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> #define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define lc rt << 1
#define rc rt << 1 | 1 using namespace std; const int MAXN = ;
const int INF = << ; struct node
{
int exp, level;
int min_dis;
int flag;
}; int N, K, Q;
node Tr[ MAXN << ];
int sum[]; void build( int l, int r, int rt )
{
Tr[rt].exp = Tr[rt].flag = ;
Tr[rt].level = ;
Tr[rt].min_dis = sum[];
if ( l == r ) return ;
int m = ( l + r ) >> ;
build( lson );
build( rson );
return;
} void PushDown( int rt )
{
if ( Tr[rt].flag )
{
Tr[lc].exp += Tr[rt].flag * Tr[lc].level;
Tr[lc].min_dis -= Tr[rt].flag;
Tr[lc].flag += Tr[rt].flag; Tr[rc].exp += Tr[rt].flag * Tr[rc].level;
Tr[rc].min_dis -= Tr[rt].flag;
Tr[rc].flag += Tr[rt].flag; Tr[rt].flag = ;
}
return;
} void PushUp( int rt )
{
Tr[rt].level = max( Tr[lc].level, Tr[rc].level );
Tr[rt].exp = max( Tr[lc].exp, Tr[rc].exp );
Tr[rt].min_dis = min( Tr[lc].min_dis, Tr[rc].min_dis );
return;
} void Update( int L, int R, int v, int l, int r, int rt )
{
if ( l == r )
{
Tr[rt].exp += Tr[rt].level * v;
while ( Tr[rt].exp >= sum[ Tr[rt].level ] )
++Tr[rt].level;
Tr[rt].min_dis = ( sum[ Tr[rt].level ] - Tr[rt].exp ) / Tr[rt].level;
if( ( sum[ Tr[rt].level ] - Tr[rt].exp ) % Tr[rt].level ) ++Tr[rt].min_dis;
return;
}
int m = ( l + r ) >> ; if ( L == l && r == R )
{
if ( v >= Tr[rt].min_dis )
{
PushDown(rt);
if ( R <= m ) Update( L, R, v, lson );
else if ( L > m ) Update( L, R, v, rson );
else
{
Update( L, m, v, lson );
Update( m + , R, v, rson );
}
PushUp(rt);
}
else
{
Tr[rt].exp += Tr[rt].level * v;
Tr[rt].min_dis -= v;
Tr[rt].flag += v;
}
return;
} PushDown(rt); if ( R <= m ) Update( L, R, v, lson );
else if ( L > m ) Update( L, R, v, rson );
else
{
Update( L, m, v, lson );
Update( m + , R, v, rson );
} PushUp(rt); return;
} int Query( int L, int R, int l, int r, int rt )
{
if ( L <= l && r <= R ) return Tr[rt].exp;
PushDown(rt);
int m = ( l + r ) >> ;
int res = ;
if ( L <= m ) res = max( res, Query( L, R, lson ) );
if ( R > m ) res = max( res, Query( L, R, rson ) );
//PushUp(rt);
return res;
} int main()
{
int T;
int cas = ;
scanf( "%d", &T );
while ( T-- )
{
scanf( "%d%d%d", &N, &K, &Q );
for ( int i = ; i < K; ++i )
scanf( "%d", &sum[i] );
sum[K] = INF; build( , N, );
printf( "Case %d:\n", ++cas );
while ( Q-- )
{
char op[];
int a, b, c;
scanf( "%s", op );
if ( op[] == 'W' )
{
scanf( "%d%d%d", &a, &b, &c );
Update( a, b, c, , N, );
}
else
{
scanf( "%d%d", &a, &b );
printf("%d\n", Query( a, b, , N, ) );
}
}
puts("");
}
return ;
}

HDU 3954 Level up (线段树特殊懒惰标记)的更多相关文章

  1. hdu 3954 Level up(线段树)

    题目链接:hdu 3954 Level up 题目大意:N个英雄,M个等级,初始等级为1,给定每一个等级须要的经验值,Q次操作,操作分两种,W l r x:表示l~r之间的英雄每一个人杀了x个怪物:Q ...

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

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

  3. HDU 3397 线段树 双懒惰标记

    这个是去年遗留历史问题,之前思路混乱,搞了好多发都是WA,就没做了 自从上次做了大白书上那个双重懒惰标记的题目,做这个就思路很清晰了 跟上次大白上那个差不多,这个也是有一个sets标记,代表这个区间全 ...

  4. poj3468 线段树的懒惰标记

    题目链接:poj3468 题意:给定一段数组,有两种操作,一种是给某段区间加c,另一种是查询一段区间的和 思路:暴力的方法是每次都给这段区间的点加c,查询也遍历一遍区间,复杂度是n*n,肯定过不去,另 ...

  5. HDU 3954 Level up(线段树)

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

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

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

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

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

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

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

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

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

随机推荐

  1. 基于稀疏表示的图像超分辨率《Image Super-Resolution Via Sparse Representation》

    由于最近正在做图像超分辨重建方面的研究,有幸看到了杨建超老师和马毅老师等大牛于2010年发表的一篇关于图像超分辨率的经典论文<ImageSuper-Resolution Via Sparse R ...

  2. 编写第一个OpenACC程序

    原文链接 在PGI的官方网站上获得示例代码: http://www.pgroup.com/lit/samples/pgi_accelerator_examples.tar 我们的第一个例子从一个简单的 ...

  3. 第49章 在SRAM中调试代码—零死角玩转STM32-F429系列

    第49章     在SRAM中调试代码 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  4. URL中传递JSON数据

    有关于JSON如何在前后之间进行传递,转换成对象等操作,请查看  C#Json数据交互   (这篇文章主要介绍了如何转化Json格式的数据,以及如何使用) 我们在URL中传递数据一般都是 XX.asp ...

  5. 《阿里巴巴Java开发手册》阅读笔记

    1.抽象类命名使用 Abstract 或 Base 开头: 异常类命名使用 Exception 结尾: 测试类命名以它要测试的类的名称开始,以 Test 结尾. 2.POJO 类中布尔类型的变量,都不 ...

  6. Servlet的工作原理和生命周期

    Servlet的工作原理 . Web服务器加载Servlet:Web服务器启动后,它会根据每个工程的web.xml文件去查找该工程的Servlet,并且找到这些Servlet的Class文件所在的地址 ...

  7. 如何将一个div水平垂直居中

    方案一: div绝对定位水平垂直居中[margin:auto实现绝对定位元素的居中], 兼容性:,IE7及之前版本不支持 div{ width: 200px; height: 200px; backg ...

  8. TensorFlow验证码识别

    本节我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里我们识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 验 ...

  9. 9,Flask 中的蓝图(BluePrint)

    蓝图,听起来就是一个很宏伟的东西,在Flask中的蓝图 blueprint 也是非常宏伟的,它的作用就是将 功能 与 主服务 分开. 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的 ...

  10. 01,jupyter环境安装

    jupyter notebook环境安装 一.什么是Jupyter Notebook? 1. 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序.其可被应用于全过程计算:开发.文 ...