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 ...
随机推荐
- Android 特殊符号的转码大全
项目中要在string.xml 中显示特殊符号,如@号冒号等,直接写肯定不行啦..只能考虑使用ASCII码进行显示: @号 @ :号 : 空格 以下为常见的ASCII十进制交换编码: --> ...
- android json 解析 简单示例
1 下面是一个简单的json 解析的demo,废话不多说,直接上代码 package com.sky.gallery; import java.io.ByteArrayOutputStream; im ...
- 读一读Scktsrvr.exe的源程序
读一读Scktsrvr.exe的源程序 使用DELPHI做多层开发的朋友们都应该对Scktsrvr.exe这个程序不陌生的,Borland公司在DELPHI中给出了它的源代码.这是一个900来行的程序 ...
- Delphi引用C对象文件
C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C ...
- ThinkPhp学习10
原文:ThinkPhp学习10 查询操作 Action模块 User下的search public function search(){ //判断username是否已经传入,且不为空 if(isse ...
- If-Modified-Since页面是否更新
第一次先请求某个网页,抓取到本地,假设文件名为 a.html.这时文件系统有个文件的修改时间. 第二次访问网页,如果发现本地已经有了 a.html,则向服务器发送一个 If-Modified-Sinc ...
- 300M无线路由器 TL-WR842N - TP-LINK官方网站
300M无线路由器 TL-WR842N - TP-LINK官方网站 300M无线路由器TL-WR842N 11N无线技术.300Mbps无线速率 2x2MIMO架构.CCA技术,提升无线稳定性.扩大无 ...
- UVA 10622 - Perfect P-th Powers(数论)
UVA 10622 - Perfect P-th Powers 题目链接 题意:求n转化为b^p最大的p值 思路:对n分解质因子,然后取全部质因子个数的gcd就是答案,可是这题有个坑啊.就是输入的能够 ...
- Caused by: java.lang.ClassNotFoundException: org.aopalliance.intercept.MethodInterceptor
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Fai ...
- delphi 使用superobject实现jsonrpc的http远程调用 good
http://blog.csdn.net/earbao/article/details/46423167