HDU 3954 Level up(线段树)
HDU 3954 Level up
题意:k个等级,n个英雄,每一个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,还有一个操作询问区间经验最大值
思路:由于等级少,所以每一个结点用Max[10]记录下每一个等级的最大值,假设有一个升级就一直找究竟,由于一个英雄升级最多10次,所以这个操作最多就10W次能够接受,剩下就是普通的区间改动区间查询的延迟操作了
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 10005;
const int M = 11; int t, n, k, qw, need[M]; #define lson(x) ((x<<1)+1)
#define rson(x) ((x<<1)+2) struct Node {
int l, r, Max[M], add;
bool cover;
} node[N * 4]; void build(int l, int r, int x = 0) {
node[x].l = l; node[x].r = r;
memset(node[x].Max, -1, sizeof(node[x].Max));
node[x].Max[1] = 0;
node[x].add = 0;
node[x].cover = false;
if (l == r) return;
int mid = (l + r) / 2;
build(l, mid, lson(x));
build(mid + 1, r, rson(x));
} bool judge(int x, int v) {
for (int i = 1; i < k; i++) {
if (node[x].Max[i] == -1) continue;
if (node[x].Max[i] + i * v >= need[i + 1]) return true;
}
return false;
} void pushup(int x) {
node[x].cover = (node[lson(x)].cover && node[rson(x)].cover);
for (int i = 1; i <= k; i++)
node[x].Max[i] = max(node[lson(x)].Max[i], node[rson(x)].Max[i]);
} void pushdown(int x) {
if (node[x].add) {
node[lson(x)].add += node[x].add;
node[rson(x)].add += node[x].add;
for (int i = 1; i <= k; i++) {
if (node[lson(x)].Max[i] != -1)
node[lson(x)].Max[i] += node[x].add * i;
if (node[rson(x)].Max[i] != -1)
node[rson(x)].Max[i] += node[x].add * i;
}
node[x].add = 0;
}
} void add(int l, int r, int v, int x = 0) {
if (node[x].l >= l && node[x].r <= r && (node[x].cover || !judge(x, v))) {
node[x].add += v;
for (int i = 1; i <= k; i++) {
if (node[x].Max[i] == -1) continue;
node[x].Max[i] += i * v;
}
return;
}
if (node[x].l == node[x].r) {
int have;
for (int i = 1; i < k; i++) {
if (node[x].Max[i] != -1) {
have = node[x].Max[i] + i * v;
break;
}
}
memset(node[x].Max, -1, sizeof(node[x].Max));
for (int i = 2; i <= k; i++) {
if (have < need[i]) {
node[x].Max[i - 1] = have;
return;
}
}
node[x].Max[k] = have;
node[x].cover = true;
return;
}
int mid = (node[x].l + node[x].r) / 2;
pushdown(x);
if (l <= mid) add(l, r, v, lson(x));
if (r > mid) add(l, r, v, rson(x));
pushup(x);
} int query(int l, int r, int x = 0) {
if (node[x].l >= l && node[x].r <= r) {
for (int i = k; i >= 1; i--) {
if (node[x].Max[i] == -1) continue;
return node[x].Max[i];
}
}
int mid = (node[x].l + node[x].r) / 2;
int ans = 0;
pushdown(x);
if (l <= mid) ans = max(ans, query(l, r, lson(x)));
if (r > mid) ans = max(ans, query(l, r, rson(x)));
pushup(x);
return ans;
} int main() {
int cas = 0;
scanf("%d", &t);
while (t--) {
printf("Case %d:\n", ++cas);
scanf("%d%d%d", &n, &k, &qw);
for (int i = 2; i <= k; i++)
scanf("%d", &need[i]);
build(1, n);
char op[15];
int a, b, c;
while (qw--) {
scanf("%s%d%d", op, &a, &b);
if (op[0] == 'W') {
scanf("%d", &c);
add(a, b, c);
} else printf("%d\n", query(a, b));
}
printf("\n");
}
return 0;
}
HDU 3954 Level up(线段树)的更多相关文章
- hdu 3954 Level up(线段树)
题目链接:hdu 3954 Level up 题目大意:N个英雄,M个等级,初始等级为1,给定每一个等级须要的经验值,Q次操作,操作分两种,W l r x:表示l~r之间的英雄每一个人杀了x个怪物:Q ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- HDU 3954 Level up(多颗线段树+lazy操作)
又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...
- HDU 4107 Gangster(线段树 特殊懒惰标记)
两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...
- HDU 5091---Beam Cannon(线段树+扫描线)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- HDU 5820 (可持久化线段树)
Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...
随机推荐
- 编写在浏览器中不弹出警告的ActiveX控件
我们在编写ActiveX控件时,如果用在浏览器中,经常都会弹出现在运行的脚本不安全的提示, 如果给客户使用,将会带来极大不便.按照MSDN的介绍通常有两种一种是实现IObjectSafe接口,一种是通 ...
- 我们熟悉的Textbox
创建只读文本框 方法一: 可用Readonly属性防止用户编辑文本框内容.将Readonly属性设置为True后,用户就可以滚动文本框中的文本并将其突出显示,但不能作任何更改.将Readonly属性设 ...
- Swift - 标签条(UITabBar)标签页控制器(UITabBarController)用法
App底部的tab标签页可以方便的把功能模块划分清楚,只需点击相应的标签页就可以展示完全独立的视图页面,同时各标签页间的视图也可以进行数据交换. TabBarItem系统自带图标样式(System ...
- Swift - 文本标签(UILabel)的用法
1,标签的创建 1 2 3 4 5 6 7 8 9 10 import UIKit class ViewController: UIViewController { override func ...
- delphi 使用superobject实现jsonrpc的http远程调用 good
http://blog.csdn.net/earbao/article/details/46423167
- counting objects in class
參考文献:pgno=1">http://www.drdobbs.com/cpp/counting-objects-in-c/184403484? pgno=1
- 快速学会搭建SVN服务器
原文:快速学会搭建SVN服务器 SVN是一个版本控制工具,常用于我们软件开发项目中,用来管理我们团队共同使用的代码,文档等历史版本的管理,保持代码的更新,避免混乱. 需要工具: svn安装程序:免费下 ...
- 微信公众平台PHP开发
p=932" style="color: rgb(255, 153, 0); text-decoration: none;">微信公众平台PHP开发 2013.05 ...
- Adaboost的几个人脸检测网站
[1]基础学习笔记之opencv(1):opencv中facedetect例子浅析 http://www.cnblogs.com/tornadomeet/archive/2012/03/22/2411 ...
- exit()和_exit()和return
exit()和return的差别: 依照ANSI C,在最初调用的main()中使用return和exit()的效果同样. 但要注意这里所说的是"最初调用".假设main()在一个 ...