CDOJ1324-卿学姐与公主 【线段树点更新】
http://acm.uestc.edu.cn/#/problem/show/1324
卿学姐与公主
Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏
在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中。
英勇的卿学姐拔出利刃冲向了拯救公主的道路。
走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王的第一道城关。
在这个城关面前的是魔王的精锐部队,这些士兵成一字排开。
卿学姐的武器每次只能攻击一个士兵,并造成一定伤害,卿学姐想知道某时刻从L
到R
这个区间内,从开始到现在累计受伤最严重的士兵受到的伤害。
最开始每个士兵的受到的伤害都是0
Input
第一行两个整数N,Q表示总共有N个士兵编号从1到N,和Q个操作。
接下来Q行,每行三个整数,首先输入一个t,如果t是1,那么输入p,x,表示卿学姐攻击了p这个位置的士兵,并造成了x的伤害。如果t是2,那么输入L,R,表示卿学姐想知道现在[L,R]闭区间内,受伤最严重的士兵受到的伤害。
1≤N≤100000
1≤Q≤100000
1≤p≤N
1≤x≤100000
1≤L≤R≤N1≤L≤R≤
Output
对于每个询问,回答相应的值
Sample input and output
Sample Input | Sample Output |
---|---|
5 4 |
0 |
思路:线段树 点更新
代码:
#include <fstream>
#include <iostream>
using namespace std; #define MAX 100005
#define ll long long int class SegmentTree
{
private:
int n;
struct Node
{
int left, right, mid;
ll maxval;
Node (): maxval()
{}
}*tree;
public:
SegmentTree (int n): n(n)
{
tree = new Node[n<<];
}
~SegmentTree ()
{
delete []tree;
}
void Build ();
void Update (int id, int subid, int val);
ll Search (int id, int left, int right);
};
void SegmentTree::Build () //非递归,由于叶子只能出现在树的最后两层,故而可以以tree[i].left < n作为循环条件进行非递归操作。需要说明的是,这里把最后一层的多余内存也初始化了,不过不影响全局。
{
int t1;
tree[].left = ;
tree[].right = n;
tree[].mid = (n + ) >> ;
for (int i = ; tree[i].left < n; i++)
{
if (tree[i].left < tree[i].right)
{
t1 = i << ;
tree[t1].left = tree[i].left;
tree[t1].right = tree[i].mid;
tree[t1].mid = (tree[t1].left + tree[t1].right) >> ;
t1++;
tree[t1].left = tree[i].mid + ;
tree[t1].right = tree[i].right;
tree[t1].mid = (tree[t1].left + tree[t1].right) >> ;
}
}
}
void SegmentTree::Update (int id, int subid, int val)
{
if (tree[id].left == tree[id].right)
{
tree[id].maxval += val;
}
else if (tree[id].mid >= subid)
{
Update(id << , subid, val);
tree[id].maxval = max(tree[id << ].maxval, tree[id].maxval);
}
else if (tree[id].mid < subid)
{
Update((id << )|, subid, val);
tree[id].maxval = max(tree[id].maxval, tree[(id << )|].maxval);
}
}
ll SegmentTree::Search (int id, int left, int right)
{
if (tree[id].left == left && tree[id].right == right)
{
return tree[id].maxval;
}
else if (tree[id].mid >= right)
{
return Search(id << , left, right);
}
else if (tree[id].mid < left)
{
return Search((id << )|, left, right);
}
else
{
return max(Search(id << , left, tree[id].mid), Search((id << )|, tree[id].mid + , right));
}
} int main ()
{
//freopen("D:\\input.in","r",stdin);
int n, q, t, p, x;
scanf ("%d %d", &n, &q);
SegmentTree lv(n);
lv.Build();
for (int i = ; i < q; i++)
{
scanf ("%d %d %d", &t, &p, &x);
if (t == )
{
lv.Update(, p, x);
}
else
{
printf("%lld\n", lv.Search(, p, x));
}
}
return ;
}
代码2:递归
#include <fstream>
#include <iostream>
using namespace std; #define MAX 100005
#define ll long long int class SegmentTree
{
private:
int n;
struct Node
{
int left, right, mid;
ll maxval;
Node (): maxval()
{}
}*tree;
public:
SegmentTree (int n): n(n)
{
tree = new Node[n<<];
}
~SegmentTree ()
{
delete []tree;
}
void Build (int id, int left, int right);
void Update (int id, int subid, int val);
ll Search (int id, int left, int right);
};
void SegmentTree::Build (int id, int left, int right) //递归
{
tree[id].left = left;
tree[id].right = right;
tree[id].mid = (left + right) >> ;
if (tree[id].mid == right)
{
return;
}
Build(id << , left, tree[id].mid);
Build((id << )|, tree[id].mid + , right);
}
void SegmentTree::Update (int id, int subid, int val)
{
if (tree[id].left == tree[id].right)
{
tree[id].maxval += val;
}
else if (tree[id].mid >= subid)
{
Update(id << , subid, val);
tree[id].maxval = max(tree[id << ].maxval, tree[id].maxval);
}
else if (tree[id].mid < subid)
{
Update((id << )|, subid, val);
tree[id].maxval = max(tree[id].maxval, tree[(id << )|].maxval);
}
}
ll SegmentTree::Search (int id, int left, int right)
{
if (tree[id].left == left && tree[id].right == right)
{
return tree[id].maxval;
}
else if (tree[id].mid >= right)
{
return Search(id << , left, right);
}
else if (tree[id].mid < left)
{
return Search((id << )|, left, right);
}
else
{
return max(Search(id << , left, tree[id].mid), Search((id << )|, tree[id].mid + , right));
}
} int main ()
{
//freopen("D:\\input.in","r",stdin);
int n, q, t, p, x;
scanf ("%d %d", &n, &q);
SegmentTree lv(n);
lv.Build(, , n);
for (int i = ; i < q; i++)
{
scanf ("%d %d %d", &t, &p, &x);
if (t == )
{
lv.Update(, p, x);
}
else
{
printf("%lld\n", lv.Search(, p, x));
}
}
return ;
}
CDOJ1324-卿学姐与公主 【线段树点更新】的更多相关文章
- A - 卿学姐与公主(线段树+单点更新+区间极值)
A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- cdoj 1324 卿学姐与公主 线段树裸题
卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit St ...
- cdoj1324卿学姐与公主
地址:http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memo ...
- CDOJ 1324 卿学姐与公主(分块)
CDOJ 1324 卿学姐与公主(分块) 传送门: UESTC Online Judgehttp://acm.uestc.edu.cn/#/problem/show/1324 某日,百无聊赖的卿学姐打 ...
- UESTC - 1324 卿学姐与公主
题目链接 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了 ...
- 卿学姐与公主 UESTC - 1324 分块模板题
题意:http://acm.uestc.edu.cn/#/problem/show/1324 中文题,自己看喽. 题解:分块模板,update时顺便更新块属性.ask时先判掉belong[l]==be ...
- UESTC 1324:卿学姐与公主(分块)
http://acm.uestc.edu.cn/#/problem/show/1324 题意:…… 思路:卿学姐的学习分块例题. 分块是在线处理区间问题的类暴力算法,复杂度O(n*sqrt(n)),把 ...
- B - 卿学姐与基本法 (离散化+成段更新+区间求和)
卿学姐与基本法 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- CDOJ 1324 卿学姐与公主 分块
题目地址 分块模板 #include<cstdio> #include<algorithm> #include<math.h> using namespace st ...
- UESTC 1324 卿学姐与公主 分块板子
#include<iostream> #include<cmath> using namespace std; ; //表示当前数在哪一块里面 int belong[maxn] ...
随机推荐
- php开发工程师面必问题
随着培训机构的增加,越来越多的php从业者流入市场,从而影响了php就业环境.公司对人才的要求越来越高,而技术者本身也要技术过硬,学习越来越多的东西,因为只有这样,你才能跑在别人前面,才不被市场抛弃, ...
- 下载 OS X 10.11 GM
不清楚为什么OS X 10.11 GM版本是Coming Soon,可以通过下面简单方法启用App Store下载. 在终端执行: $ sudo softwareupdate --clear-cata ...
- 伯乐在线资讯URL
伯乐资讯URL # encoding: utf-8 import requests from bs4 import BeautifulSoup import csv import time base_ ...
- HANA IMPORT AND EXPORT
权限管控的过于严格,所以找机会写个导入导出的流程.从测试机传输到生产机 1 选中EXPORT , 导出将要传输的模型 也可以 在QUICK VIEW 里选中导入导出.个人爱好 2 选择传输的两种模式 ...
- vue项目中如何将工具函数模块化导出
如下所示,utils文件夹下的js里都是封装好的工具函数, 如formatDate.js内容如下: export default (day)=>{ var tmpDate = day ? new ...
- 06-THREE.JS 给所有物体相同的材质
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- Java_脚本引擎_01_用法入门
一.前言 最近有个需求,需要在js中调用java,这样能避免更新java,从而实现代码的热更新. 于是想到用 Nashorn JavaScript 引擎. 二.概述 通过 JDK 8 的 Nashor ...
- 剑指offer--14.求1+2+3+...+n
&&短路原理 ------------------------------------------------------------------------------------- ...
- CodeForces - 803F: Coprime Subsequences(莫比乌斯&容斥)
Let's call a non-empty sequence of positive integers a1, a2... ak coprime if the greatest common div ...
- JavaScript正则常用知识总结
一.JavaScript正则相关方法 str.match(regexp)与regexp.exec(str)功能类似. str.search(regexp)与regexp.test(str)功能类似. ...