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. 中期ppt制作

    陀螺仪的使用解释:https://zhuanlan.zhihu.com/p/29244429 手机坐标轴的图片:http://jcjs.siat.ac.cn/ch/reader/create_pdf. ...

  2. sz 命令

    sz命令 下载文件命令 sz  文件名

  3. C#定义常量的两种方法

    在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant).前者用“const”来定义,后者用“readonl ...

  4. js中this的运用

    this 永远指向函数运行时所在的对象,而不是函数创建时所在的对象 匿名函数和不处于任何对象中的函数,This指向window call, apply, with指的This是谁就是谁. 普通函数调用 ...

  5. Java开发.gitignore文件包含.iml,.log的看法

    有一个开源项目https://github.com/github/gitignore 主要用来规范所有开发项目的.gitignore文件的编写,基本涵盖了所有的开发语言.开发环境等.今日我向JetBr ...

  6. 连接MYSQL 错误代码2003

    问题是服务里面mysql没有启动或者mysql服务丢失 解决办法: 开始->运行->cmd,进到mysql安装的bin目录(以我的为例,我的安装在D盘)D:\MySQL\bin>my ...

  7. PHP生成ZIP压缩文件

    PHP生成ZIP压缩文件 /* * 生成zip压缩文件 * $sourceDir:被压缩的文件夹或文件 * $outFileName:输出的压缩文件名称 * */ function createZip ...

  8. xml中Node和Element的区别

    本文转载自:http://blog.csdn.net/wcydiyi/article/details/4432636点击打开链接 1.元素(Element)和结点(Node)的区别:         ...

  9. Django自带后台管理配置

    Django自带后台管理的配置 创建项目和应用 修改配置文件 数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql' ...

  10. C语言进阶——const 和 volatile 分析09

    const只读变量: const修饰的变量是只读的,本质还是一个变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局函数区分配资源空间 const只在编译器有用,在运行期无用 ...