HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)
I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 33469 Accepted Submission(s): 13168
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
在每个测试的第一行,有两个正整数 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。
Huge input,the C function scanf() will work better than cin
#include<stdio.h>
#define maxn 200001
int aa[maxn<<];
struct node
{
int lef,rig,maxc;
int mid(){ return lef+((rig-lef)>>); }
};
node seg[maxn<<];
void build(int left ,int right ,int p)
{
seg[p].lef=left;
seg[p].rig=right;
seg[p].maxc=;
while(left==right)
{
seg[p].maxc=aa[left];
return ;
}
int mid=seg[p].mid();
build(left,mid,p<<);
build(mid+ ,right,p<<|);
if(seg[p<<].maxc<seg[p<<|].maxc)
seg[p].maxc=seg[p<<|].maxc;
else
seg[p].maxc=seg[p<<].maxc;
}
void updata(int pos ,int p,int val)
{
if(seg[p].lef==seg[p].rig)
{
seg[p].maxc=val ;
return ;
}
int mid=seg[p].mid();
if(pos<=mid) updata(pos,p<<,val);
else if(pos>mid) updata(pos,p<<|,val);
if(seg[p<<].maxc<seg[p<<|].maxc)
seg[p].maxc=seg[p<<|].maxc;
else seg[p].maxc=seg[p<<].maxc;
}
int query(int be,int en ,int p)
{
if(be<=seg[p].lef&&seg[p].rig<=en)
return seg[p].maxc;
int res2=,res1=;
int mid=seg[p].mid();
if(be<=mid) res1=query(be,en ,p<<);
if(en>mid) res2=query(be,en ,p<<|);
if(res1<res2) return res2;
else return res1;
}
int main()
{
int nn,mm,i,j,sa,sb;
char str[];
while(scanf("%d%d",&nn,&mm)!=EOF)
{
for(i=;i<=nn;i++)
scanf("%d",&aa[i]);
build(,nn,);
while(mm--)
{
scanf("%s%d%d",str,&sa,&sb);
if(*str=='Q')
printf("%d\n",query(sa,sb,));
else updata(sa,,sb);
}
}
return ;
}
代码:
#include<cstdio>
#include<cstring>
const int maxn=;
int aa[maxn];
struct node
{
int lef,rig;
int max;
int mid(){
return lef+((rig-lef)>>);
}
};
node str[maxn<<];
inline int max(int a,int b)
{
return a>b?a:b;
}
void Build(int left ,int right,int pos)
{
str[pos].lef=left;
str[pos].rig=right;
str[pos].max=;
if(left==right){
str[pos].max=aa[left];
return ;
}
int mid=str[pos].mid();
Build(left,mid,pos<<);
Build(mid+,right,pos<<|);
str[pos].max = max( str[pos<<].max , str[pos<<|].max );
}
void Update(int ps,int pos,int val)
{
if(str[pos].lef==ps&&str[pos].rig==ps){
str[pos].max=val; //将这个数值更新
return ;
}
int mid=str[pos].mid();
if(mid>=ps) Update(ps,pos<<,val);
else if(mid<ps) Update(ps,pos<<|,val);
str[pos].max=max(str[pos<<].max,str[pos<<|].max);
}
int Query(int st,int en,int pos)
{
if(str[pos].lef>=st&&str[pos].rig<=en){
return str[pos].max;
}
int mid=str[pos].mid();
int p1=,p2=;
if(mid>=st) p1=Query(st,en,pos<<);
if(mid<en) p2=Query(st,en,pos<<|);
return max(p1,p2);
} int main()
{
int n , m,cc,dd;
char ss[];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=;i<=n;i++)
scanf("%d",aa+i);
Build(,n,);
while(m--)
{
scanf("%s %d%d",ss,&cc,&dd);
if(*ss=='Q')
printf("%d\n",Query(cc,dd,));
else Update(cc,,dd);
}
}
return ;
}
HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)的更多相关文章
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)
I Hate ItTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- UVA12532 线段树(单点更新,区间求乘积的正负)
It’s normal to feel worried and tense the day before a programming contest. To relax, you went out f ...
- HDU 3308 LCIS (线段树·单点更新·区间合并)
题意 给你一个数组 有更新值和查询两种操作 对于每次查询 输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并 线段树维护三个值 相应区间的LCIS长度(lcis) 相应区间以左 ...
- Codeforces768B-Code For 1-类似线段树-枚举+单点更新or区间更新
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门 原题目描述在最下面. 每次把\(n\ ...
- HDU1166线段树(单点更新,区间求和)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Lim ...
- hdu1754线段树的单点更新区间查询
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdoj 2795 Billboard 【线段树 单点更新 + 维护区间最大值】
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- UnityEditor研究学习之自定义Editor
UnityEditor研究学习之自定义Editor 今天我们来研究下Unity3d中自定义Editor,这个会让物体的脚本在Inspector视窗中,产生不同的视觉效果. 什么意思,举个例子,比如游戏 ...
- strstr实现
// strstr.c查找完全匹配的子字符串 #include<stdio.h> #include<string.h> char *my_strstr(const char * ...
- Ubuntu 常用命令大全
Ubuntu 常用命令大全查看软件 xxx 安装内容#dpkg -L xxx查找软件#apt-cache search 正则表达式查找文件属于哪个包#dpkg -S filename apt-file ...
- poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重
挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...
- Depth of field --Circle of confusion 推导
https://en.wikipedia.org/wiki/Circle_of_confusion https://developer.download.nvidia.com/books/HTML/g ...
- [leetcode]Valid Number @ Python
原题地址:http://oj.leetcode.com/problems/valid-number/ 题意:判断输入的字符串是否是合法的数. 解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较 ...
- [leetcode]Sort List @ Python
原题地址:http://oj.leetcode.com/problems/sort-list/ 题意:链表的排序.要求:时间复杂度O(nlogn),空间复杂度O(1). 解题思路:由于题目对时间复杂度 ...
- Kafka 配置说明
参考地址:http://my.oschina.net/infiniteSpace/blog/312890?p=1 server.properties中所有配置参数说明(解释) broker.id =0 ...
- TJ Holowaychuk是怎样学习编程的?
TJ Holowaychuk是怎样学习编程的? 学习了:https://blog.csdn.net/wozaixiaoximen/article/details/49507111 Q:TJ Holow ...
- Cognos利用DMR与文本对象设计中国式报表
场景:详细对于接触Cognos的人来说,简单的拖拉报表.交叉表这个工作大家都可以完成,下面我们就来实现一下类似下面的效果. 下面简单的说一下实现过程: 利用Framework Manager创建DMR ...