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 ...
随机推荐
- python——获取数据类型:type()、isinstance()的使用方法:
python——获取数据类型 在python中,可使用type()和isinstance()内置函数获取数据类型 如: (1)type()的使用方法: >>> a = '230' ...
- Gunicorn+Flask中重复启动后台线程问题
假设程序如下: if __name__ == '__main__': t = Thread(target=test) t.start() app.run(host='0.0.0.0',port=808 ...
- 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: TEMP
ylbtech-Oracle:数据库实例: STOREBOOK > 表空间 > 编辑 表空间: TEMP 表空间 > 编辑 表空间: TEMP 1. 一般信息返回顶部 1 ...
- 用过Retina视网膜屏幕的笔记本电脑的后果
用过Retina视网膜屏幕的笔记本电脑的后果是过程中感觉很不错,但是结果是普通屏幕再也看不上眼了.发现了原来看的好好的屏幕多出了许多的像素点,没办法,火眼金睛了.
- ubuntu14.04上编译安装python3.7.3
首先先去python官网www.python.org下载python3.7.3的官方压缩包Python-3.7.3.tgz 一.先安装需要的包zlib1g,libffi apt-get update ...
- Effective C++ Item 43 学习处理模板化基类内的名称
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:可在derived class templates 内通过 "this-&g ...
- Squid普通代理&&透明代理&&反向代理学习
普通代理 背景 ...
- [置顶] 自定义的解压进度条 关于ProgressBar的使用
整体布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- ElasticSearch+Kinaba 在Windows下的安装
转自:https://blog.csdn.net/qq_28795681/article/details/79723455 1.下载安装java 2.下载ElasticSearch和Kinaba,并解 ...
- Win10系统下面的TR1008解决方案
最近为了体验高大上的Win10系统,于是就把本本原来的Win7旗舰版 升级 到了Win10专业版.之后又在本本上部署了cognos,但是在打开Transform导入IQD数据源的时候就报错了,错误和之 ...