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
2 1 2
1 2 4
1 3 5
2 3 3
0
5

思路:线段树 点更新

代码:

 #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-卿学姐与公主 【线段树点更新】的更多相关文章

  1. A - 卿学姐与公主(线段树+单点更新+区间极值)

    A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  2. cdoj 1324 卿学姐与公主 线段树裸题

    卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  3. cdoj1324卿学姐与公主

    地址:http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memo ...

  4. CDOJ 1324 卿学姐与公主(分块)

    CDOJ 1324 卿学姐与公主(分块) 传送门: UESTC Online Judgehttp://acm.uestc.edu.cn/#/problem/show/1324 某日,百无聊赖的卿学姐打 ...

  5. UESTC - 1324 卿学姐与公主

    题目链接 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了 ...

  6. 卿学姐与公主 UESTC - 1324 分块模板题

    题意:http://acm.uestc.edu.cn/#/problem/show/1324 中文题,自己看喽. 题解:分块模板,update时顺便更新块属性.ask时先判掉belong[l]==be ...

  7. UESTC 1324:卿学姐与公主(分块)

    http://acm.uestc.edu.cn/#/problem/show/1324 题意:…… 思路:卿学姐的学习分块例题. 分块是在线处理区间问题的类暴力算法,复杂度O(n*sqrt(n)),把 ...

  8. B - 卿学姐与基本法 (离散化+成段更新+区间求和)

    卿学姐与基本法 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  9. CDOJ 1324 卿学姐与公主 分块

    题目地址 分块模板 #include<cstdio> #include<algorithm> #include<math.h> using namespace st ...

  10. UESTC 1324 卿学姐与公主 分块板子

    #include<iostream> #include<cmath> using namespace std; ; //表示当前数在哪一块里面 int belong[maxn] ...

随机推荐

  1. 终端命令对字符串进行sha1、md5、base64、urlencode/urldecode

    sha1.md5.base64 mac $ echo -n foo|shasum 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33 - $ 2c26b46b68ffc6 ...

  2. python 实现一个TwoSum的例子

    今天无意中看到一个题目,也不是很难,就想着用python实现以下: 题目是数组中的两个数相加等于输入的一个target,然后输出数组的下标. 比如: [1,2,3,4,5,6] target=7  返 ...

  3. hdoj-1027-Ignatius and the Princess II(逆康拓展开)

    题目链接 /* Name: Copyright: Author: Date: 2018/5/2 11:07:16 Description:输出第m小的序列 */ #include <iostre ...

  4. codeforces C. Pearls in a Row map的应用

    C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. 洛谷 P2290 [HNOI2004]树的计数

    题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ...

  6. 学习动态性能表(8)--v$lock&v$locked_object

    学习动态性能表 第八篇-(1)-V$LOCK  2007.5.31 这个视图列出Oracle 服务器当前拥有的锁以及未完成的锁或栓锁请求.如果你觉着session在等待等待事件队列那你应该检查本视图. ...

  7. Nginx配置负载均衡服务器

    最近想买一台二手电脑当Linux服务器,一直没有买,暂时用windows来搞. Nginx下载地址:http://nginx.org/download/nginx-1.2.6.zip Tomcat下载 ...

  8. CentOS6.5 下MySQL傻瓜式安装

    为了为服务器上装mysql我先在虚拟机上练习了一下特此记录并分享; 注:参考文章https://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/ ...

  9. BZOJ4358:permu

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  10. ajax中error函数参数详解

    xhr.status和error函数中的status是不一样的,error函数中的status主要包括:"success"."notmodified".&quo ...