线段树2 HDU 1754 I Hate It
来源:互联网 发布:眉毛黄金比例数据 编辑:程序博客网 时间:2024/06/06 10:05
I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 86670 Accepted Submission(s): 33229
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。
在每个测试的第一行,有两个正整数 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
5659HintHuge input,the C function scanf() will work better than cin
这里是题的链接 点击打开链接
上代码:
#include <iostream>using namespace std;struct Node { //线段树叶子节点 int l; int r; int max;};int Max(int i,int j){ return i>j?i:j;}Node tree[800010]; // Tree是线段树的数组实现void build(int i,int l,int r){ //建立第i个节点,l,r是需要建立的区间; tree[i].l = l , tree[i].r = r ; // 这个节点涉及的左右端点值; if (l==r) { //叶子节点 scanf("%d",&tree[i].max); } else { //建立这个节点的字节点 int mid = (l+r)>>1; build(i<<1,l,mid); //左子树 build(i<<1|1,mid+1,r); //右子树 tree[i].max = Max(tree[i<<1].max,tree[i<<1|1].max); //已经建立完了所有的儿子节点,刷新父节点的值; }}void update(int i, int pos , int val){ // i是当前更新节点,pos是需要更新的位置,val是值 if (tree[i].l == tree[i].r) { //找到了当前节点; tree[i].max = val; return ; } int mid = (tree[i].l + tree[i].r)>>1; if (mid >= pos){ update(i<<1,pos,val); } else { update(i<<1|1,pos,val); } tree[i].max = Max(tree[i<<1].max , tree[i<<1|1].max);}int query(int i,int l,int r){ // 在节点i查询[l,r]; if (tree[i].l==l && tree[i].r==r){ return tree[i].max; } int mid = (tree[i].l + tree[i].r)>>1; if (mid>=r) { //在左子树查询区间 return query(i<<1,l,r); } else if (mid<l){ return query(i<<1|1,l,r); } else { return Max(query(i<<1,l,mid),query(i<<1|1,mid+1,r)); }}int main(){ int N,Q; while (cin>>N>>Q){ build(1,1,N); while (Q--){ string c;int n1,n2; cin>>c; scanf("%d%d",&n1,&n2); if (c[0]=='U'){ update(1,n1,n2); } else printf("%d\n",query(1,n1,n2)); } } }
阅读全文
0 0
- HDU 1754 I Hate It 线段树
- [hdu] 1754 I hate it -- 线段树
- hdu 1754 -- I Hate It (线段树)
- HDU 1754 I Hate It 线段树
- 线段树 hdu 1754 I Hate It
- HDU 1754 I Hate It(线段树)
- hdu 1754 (线段树)I Hate It
- hdu-1754 I Hate It 线段树
- HDU--1754 -- I Hate It [线段树]
- 【线段树】hdu 1754 I hate it
- hdu - 1754 I Hate It(线段树)
- HDU--1754--I Hate It--线段树
- HDU-1754 I Hate It 线段树
- hdu 1754 I Hate It 线段树
- HDU-1754-I Hate It(线段树)
- HDU 1754 I Hate It (线段树)
- hdu 1754 I hate it(线段树)
- 【HDU】 1754 I Hate It 线段树
- 377. Combination Sum IV
- 每天一个linux命令(29):chgrp命令
- 实现Action的三种方式(四)
- [FC][子弹数修改教程]
- Centos下卸载、重装、更新mysql
- 线段树2 HDU 1754 I Hate It
- SFC简单修改教程
- 使用Proguard进行代码混淆
- Python 重访类型分类
- SDL编程
- 每天一个linux命令(30): chown命令
- 说说,博客,贴吧评论设计问题
- 【重磅】吴恩达又一项目Landing.ai曝光,这一次,他是要给传统制造业狠狠开刀!
- 【重磅】工业和信息化部发布《促进新一代人工智能产业发展三年行动计划(2018-2020年)》