hdu 1754 线段树 单点更新 动态区间最大值
I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 52417 Accepted Submission(s): 20598
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define INF 0xfffffff
using namespace std;
int MAXV=-INF;
int MINV=INF;
struct tree
{
int L;
int R;
int maxv;
int minv;
int mid()
{
return (L+R)/2;
}
}tree[600010];
void buildtree(int root,int ss,int ee)
{
tree[root].L=ss;
tree[root].R=ee;
tree[root].minv=INF;
tree[root].maxv=-INF;
if(ss!=ee)
{
buildtree(2*root,ss,(ss+ee)/2);
buildtree(2*root+1,(ss+ee)/2+1,ee);
}
}
void insetree(int root ,int i,int s)
{
if(tree[root].L==tree[root].R)
{
tree[root].maxv=s;
tree[root].minv=s;
return ;
}
tree[root].maxv=max(tree[root].maxv,s);
tree[root].minv=min(tree[root].minv,s);
if(i<=tree[root].mid())
insetree(2*root,i,s);
else
insetree(2*root+1,i,s);
tree[root].maxv=max(tree[2*root].maxv,tree[2*root+1].maxv);//关键所在
}
void Query(int root,int ss,int ee)
{
if(tree[root].minv>=MINV&&tree[root].maxv<=MAXV)
return;
if(tree[root].L==ss&&tree[root].R==ee)
{ //cout<<"1****5"<<endl;
MAXV=max(tree[root].maxv,MAXV);
MINV=min(tree[root].minv,MINV);
return ;
}
if(ee<=tree[root].mid())
Query(2*root,ss,ee);
else if(ss>tree[root].mid())
Query(2*root+1,ss,ee);
else
{
// cout<<"1*****4"<<endl;
Query(2*root,ss,tree[root].mid());
Query(2*root+1,tree[root].mid()+1,ee); }
}
int main()
{
int n,m;
int chushi;
while(scanf("%d %d",&n,&m)!=EOF)
{
MAXV=-INF;
MINV=INF;
buildtree(1,1,n);
for(int i=1;i<=n;i++)
{
scanf("%d",&chushi);
insetree(1,i,chushi);
}
int ss,ee;
char panduan;
for(int j=1;j<=m;j++)
{ //scanf("%c",&panduan);
// getchar();
// scanf("%d %d",&ss,&ee);
cin>>panduan>>ss>>ee;
MAXV=-INF;
MINV=INF;
if(panduan=='Q')
{
Query(1,ss,ee);
printf("%d\n",MAXV);
}
else
insetree(1,ss,ee);
}
}
return 0;
}
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
6
5
9
Huge input,the C function scanf() will work better than cin
hdu 1754 线段树 单点更新 动态区间最大值的更多相关文章
- HDU - 1754 线段树-单点修改+询问区间最大值
这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...
- hdoj 2795 Billboard 【线段树 单点更新 + 维护区间最大值】
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...
- hdu 1166线段树 单点更新 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 2795 线段树单点更新
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 1754 I Hate It 【线段树单点修改 维护区间最大值】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others ...
- HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)
题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...
- HDU 3308 线段树单点更新+区间查找最长连续子序列
LCIS Time Limit: 6000/2000 MS (Java/Oth ...
随机推荐
- 对HashMap进行排序
首先来看看Map集合获取元素的三种常见方法keySet().values().entrySet() 1. values():返回map集合的所有value的Collection集合(于集合中无序存放) ...
- (原) MaterialEditor部- UmateriaEditor中 Node编译过程和使用(2)
@白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ 需求: 1.梳理FexpressionInput和Output的编译和链接(套路和逻辑目的) 2.如何做到节点编译 ...
- 【zabbix 监控】第一章 zabbix的安装配置
安装前准备 一.下载网络yum源: http://mirrors.163.com/.help/centos.html https://opsx.alibaba.com/mirror 1.首先备份/et ...
- cygwin—excellent work!
使用cygwin的好处在于可以避免直接使用linux同时又能最大限度的节省资源,共享windows的资源. 安装cygwin 安装安简单,当然,你首先需要使用163或者国内或者亚洲比较好的镜像作为下载 ...
- C复合文字
C99之前,可以传递数组,但是没有所谓的数组常量可供传递,于是新增了复合文字. 普通数组声明方法: int d[2]={10,20}; 复合文字声明: 与数组名相同,常量同时代表元素的地址. (int ...
- 统计学习三:1.k近邻法
全文引用自<统计学习方法>(李航) K近邻算法(k-nearest neighbor, KNN) 是一种非常简单直观的基本分类和回归方法,于1968年由Cover和Hart提出.在本文中, ...
- Python3 Tkinter-Listbox
1.创建 from tkinter import * root=Tk() lb=Listbox(root) for item in ['python','tkinter','widget']: lb. ...
- Kali渗透测试工具-netcat
netcat被称作是网络工具当中的瑞士军刀,短小却功能强大 1.端口扫描 nc -nvz 目标IP 端口范围 eg: nc -nvz 192.168.1.105 1-65535 -n参数是不要使用DN ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- java — 设计模式
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 一.设计模式的分类 ...