hdu 1754:I Hate It(线段树,入门题,RMQ问题)
I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 33726 Accepted Submission(s): 13266
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
在每个测试的第一行,有两个正整数 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 MAXSIZE 200000
struct Node{
int left,right;
int n;
};
Node a[MAXSIZE*+];
void Init(Node a[],int L,int R,int d) //初始化线段树
{
if(L==R){ //当前节点没有儿子节点,即递归到叶子节点。递归出口
a[d].left = L;
a[d].right = R;
a[d].n = ;
return ;
} int mid = (L+R)/; //初始化当前节点
a[d].left = L;
a[d].right = R;
a[d].n = ; Init(a,L,mid,d*); //递归初始化当前节点的儿子节点
Init(a,mid+,R,d*+); }
void Update(Node a[],int L,int R,int d,int x) //对区间[L,R]插入值x,从节点d开始更新。
{
if(L==a[d].left && R==a[d].right){ //插入的区间匹配,则直接修改该区间值
a[d].n = x;
return ;
}
if(x>a[d].n) //沿路节点比该值小的都重新赋值
a[d].n = x;
int mid = (a[d].left + a[d].right)/;
if(R<=mid){ //中点在右边界R的右边,则应该插入到左儿子
Update(a,L,R,d*,x);
}
else if(mid<L){ //中点在左边界L的左边,则应该插入到右儿子
Update(a,L,R,d*+,x);
}
else { //否则,中点在待插入区间的中间
Update(a,L,mid,d*,x);
Update(a,mid+,R,d*+,x);
}
}
int Query(Node a[],int L,int R,int d) //查询区间[L,R]的值,从节点d开始查询
{
if(L==a[d].left && R==a[d].right){ //查找到区间,则直接返回该区间值
return a[d].n;
}
int mid = (a[d].left + a[d].right)/;
if(R<=mid){ //中点在右边界R的右边,则应该查询左儿子
return Query(a,L,R,d*);
}
else if(mid<L){ //中点在左边界L的左边,则应该查询右儿子
return Query(a,L,R,d*+);
}
else { //中点在待查询区间的中间,左右孩子都查找
int A = Query(a,L,mid,d*);
int B = Query(a,mid+,R,d*+);
return A>B?A:B;
}
}
int main()
{
int i,n,m,A,B;
char c;
while(scanf("%d%d",&n,&m)!=EOF){
Init(a,,n,); //初始化 for(i=;i<=n;i++){ //输入
int t;
scanf("%d",&t);
Update(a,i,i,,t);
} for(i=;i<=m;i++){ //m次查询
scanf("%*"); //读掉空格
scanf("%c%d%d",&c,&A,&B);
switch(c){
case 'Q':
printf("%d\n",Query(a,A,B,));
break;
case 'U':
Update(a,A,A,,B);
break;
default:break;
}
}
}
return ;
}
Freecode : www.cnblogs.com/yym2013
hdu 1754:I Hate It(线段树,入门题,RMQ问题)的更多相关文章
- hdu 1754 I Hate It 线段树基础题
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...
- hdu 1754 I Hate It(线段树水题)
>>点击进入原题测试<< 思路:线段树水题,可以手敲 #include<string> #include<iostream> #include<a ...
- hdu 1166敌兵布阵(线段树入门题)
>>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...
- HDU 1754 I Hate It(线段树模板题)
题目链接: 传送门 I Hate It Time Limit: 3000MS Memory Limit: 32768 K Description 很多学校流行一种比较的习惯.老师们很喜欢询问, ...
- hdu 1754 I Hate It 线段树 点改动
// hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- 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 线段树RMQ
I Hate It Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=175 ...
- HDU 1754 I Hate It(线段树单点替换+区间最值)
I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...
- HDU 1754 I Hate It (线段树)
题意:略. 析:裸的线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include < ...
随机推荐
- POJ 3281 网络流dinic算法
B - Dining Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...
- js 函数前的+号
不知啥时候起,函数的闭包需要增加+才能立即执行了. 不加反而报语法错.orz +function() { console.log("Foo!"); }(); 输出: Foo!< ...
- zend studio安装svn插件
进入zend->Help->Install New Software 输入如下地址: http://subclipse.tigris.org/update_1.8.x 选择subclips ...
- string转DateTime(时间格式转换)
1.不知道为什么时间在数据库用varchar(8)来保存,例如"19900505",但是这样的保存格式在处理时间的时候是非常不方便的. 但是转换不能用Convert.ToDateT ...
- ios UITextView 计算文字内容大小
先设置好 textView的内容文字,再调用以下代码,就能够得到文字内容的size,其中参数表示最大的size的尺寸,通常,高度应该不限制,宽度是控件的宽度. let newSize = statem ...
- /etc/securetty文件
/etc/securetty 文件允许你规定“root”用户可以从哪个tty设备登录. 登录程序(通常是/bin/login)需要读取“/etc/securetty”文件. 它的格式:列出来的tty设 ...
- 进程&线程 同步异步&阻塞非阻塞
2015-08-19 15:23:38 周三 线程 线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 线程安全问题都是由全局变量及静态变量引起的 若每个线程中对 ...
- 添加或修改ssh服务的端口
通常ssh远程登录的默认端口是22,这个端口一般是可以更改或者添加的,配置文件位置在:/etc/ssh/sshd_config通过编辑文件可以修改sshd服务的相关配置,以下新增端口2223,即除了2 ...
- ada 图形编辑器 - GNAT GPL
The GNAT GPL and SPARK GPL Editions are made available to the free software developers by AdaCore. T ...
- ajax删除数据后刷新页面
代码如图: 理解: 发送请求后删除name 属性为 name 的data;用rem .remove删除: 删除后找到页面上app的数量:定义page = len/12+1; 找到当前页是哪一页,如果l ...