博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树 hdoj 1754
阅读量:4216 次
发布时间:2019-05-26

本文共 2150 字,大约阅读时间需要 7 分钟。

I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 94005    Accepted Submission(s): 35617


Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。

这让很多学生很反感。


不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
 

Input
本题目包含多组测试,请处理到文件结束。

在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。

学生ID编号分别从1编到N。

第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。

接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。

当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。

当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

 

Output
对于每一次询问操作,在一行里面输出最高成绩。
 

Sample Input
 
5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
 

Sample Output

5

6

5

9

单点更新,最大值

#include
#include
#include
#include
#include
using namespace std;const int MAXN = 200000+5;int n,m;int tree[MAXN<<2];int add[MAXN<<2];int a[MAXN];char c[5];void build(int p, int l, int r) { if(l == r){ tree[p] = a[l]; return ; } int m = (l+r)>>1; build(p<<1,l,m); build(p<<1|1,m+1,r); tree[p] = max(tree[p<<1],tree[p<<1|1]); }void updateOne(int p, int l, int r, int ind,int x) { if(l == r){ tree[p] = x; //这里是tree[p] 不是tree[l] return; } int m = (l+r)>>1; if(ind <= m) updateOne(p<<1,l,m,ind,x); else updateOne(p<<1|1,m+1,r,ind,x); tree[p] = max(tree[p<<1],tree[p<<1|1]); } int query(int p, int l, int r, int tl, int tr) { if(l >= tl && r <= tr){ return tree[p]; } int m = (l+r)>>1; int ans = 0; if(tl <= m) ans = max(query(p<<1,l,m,tl,tr),ans); if(tr > m) ans = max(query(p<<1|1,m+1,r,tl,tr),ans); return ans; }int main() { // freopen("C:/Users/zhangwei/Desktop/input.txt","r",stdin); while(scanf("%d%d",&n,&m) != EOF){ memset(a,0,sizeof(a)); memset(tree,0,sizeof(tree)); for(int i = 1; i <= n; ++i){ scanf("%d",&a[i]); } build(1,1,n);// int ans = query(1,1,n,1,n);// printf("%d\n",ans); while(m--){ scanf("%s",c); int a,b; scanf("%d%d",&a,&b); //printf("%s %d %d\n",c,a,b); if(c[0] == 'Q'){ int ans = query(1,1,n,a,b); printf("%d\n",ans); } else if(c[0] == 'U'){ updateOne(1,1,n,a,b); } } } return 0; }

转载地址:http://erimi.baihongyu.com/

你可能感兴趣的文章
Python学习笔记——多任务-线程
查看>>
Vim学习笔记——前言
查看>>
Vim学习笔记——小试牛刀
查看>>
Vim学习笔记——帮助
查看>>
Python学习笔记——网络通信过程
查看>>
Python学习笔记——正则表达式
查看>>
Python学习笔记——数据结构与算法
查看>>
Python学习笔记——顺序表
查看>>
Python学习笔记——链表
查看>>
MarkDown学习笔记——语法
查看>>
Python学习笔记——栈和队列
查看>>
Python学习笔记——排序与搜索
查看>>
Python学习笔记——爬虫之BeautifulSoup4数据提取
查看>>
Python学习笔记——爬虫的思路总结
查看>>
Python学习笔记——爬虫之动态HTML处理和机器图像识别
查看>>
Python学习笔记——爬虫之执行JavaScript语句与训练Tesseract
查看>>
Python学习笔记——爬虫之Scrapy框架
查看>>
Python学习笔记——爬虫之Scrapy项目实战
查看>>
Python学习笔记——爬虫之通过Fiddler进行手机抓包
查看>>
Python学习笔记——爬虫之Scrapy-Redis分布式组件
查看>>