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 ...
随机推荐
- 获取信息的有关Windows API(最有意思是OpenProcess和GetProcessMemoryInfo)
1.窗口信息MS为我们提供了打开特定桌面和枚举桌面窗口的函数.hDesk = OpenDesktop(lpszDesktop, 0, FALSE, DESKTOP_ENUMERATE);// 打开我们 ...
- Jenkins: 使用Jenkins搭建持续集成(CI)环境
http://www.cnitblog.com/luckydmz/archive/2012/01/03/77007.html 首先从官网http://jenkins-ci.org/下载 Java We ...
- Swift - 使用导航条和导航条控制器来进行页面切换
通过使用导航条(UINavigationBar)与导航条控制器(UINavigationController)可以方便的在主页面和多层子页面之间切换.下面通过一个简单“组件效果演示”的小例子来说明如何 ...
- Ubuntu升级到14.04
公司网络实在太翔了,搞了一天最终成功把ubuntu从13.10升级到了14.10,中间也越到了非常多问题,记录下来,以备參考. 13.10的时候想体验一把搜狗输入法,结果因为fcitx版本号太低,用了 ...
- CentOS7 下linux不能上网解决方法,centos7 eth0 没有ip,IP突然丢失
CentOS7 下linux不能上网解决方法 在CentOS VMware下安装好linux后,发现有时不能直接联网,特分享下总结出来的经验,希望对新手有用 工具/原料 XP系统 VMware.Wo ...
- Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布
首先是准备工作,去QT主页下载独立的QT类库安装包以及完整QT SDK安装包,还有QT Creator for windows 版 下载地址:http://qt.nokia.com/downloads ...
- Shell编程中Shift的用法(转)
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...
- CSU 1506(最小费用最大流)
传送门:Double Shortest Paths 题意:有两个人:给出路径之间第一个人走所需要的费用和第二个人走所需要的费用(在第一个人所需的 费用上再加上第二次的费用):求两个人一共所需要的最小费 ...
- blend
看着各位大虾出系列文章貌似挺好玩的,本人耍了2个月的Wpf,有点见解,希望各位看官笑纳.本系列第一章就先来点简单又有用的吧o(∩_∩)o 哈哈.. 终于效果例如以下: ←点它 本人一直在做WPF算是第 ...
- IOS-UITextField-邮箱后缀联想赛
最近做的项目,有一个函数,百度了一下 结果没 要研究了一下. 当用户输入邮箱形式的账号时,输入完"@"符号后.联想出经常使用的邮箱 点击某一行,将改行代表邮箱自己主动输入到账号输入 ...