hdu1754:I Hate It

I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 52473    Accepted Submission(s): 20620

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。

Output

对于每一次询问操作,在一行里面输出最高成绩。

Sample Input

5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5

Sample Output

5 6 5 9

Hint

Huge input,the C function scanf() will work better than cin

数组要开4倍,然后于是整个午休一直tle。。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
const int nmax=5000005;
const int inf=0x7fffffff;
struct edge{
 int ql,qr,p,v,n;
 int maxv[nmax];
 void init(int n){
  this->n=n;
 }
 void cc(){
  clr(maxv,0);
 }
 int query(int l,int r,int k){
  if(ql<=l&&qr>=r) return maxv[k];
  int m=l+(r-l)/2;
  int ans=-inf;
  if(ql<=m) ans=max(ans,query(l,m,2*k));
  if(qr>m) ans=max(ans,query(m+1,r,2*k+1));
  return ans;
 }
 void insert(int l,int r,int k){
  if(l==r){
   maxv[k]=v;
  }
  else{
   int m=l+(r-l)/2;
   if(p<=m) insert(l,m,2*k);
   else insert(m+1,r,2*k+1);
   maxv[k]=max(maxv[2*k],maxv[2*k+1]);
  }
 }
 int Query(int a,int b){
  ql=a;
  qr=b;
  return query(1,n,1);
 }
 void Insert(int i,int val){
  v=val;
  p=i;
  insert(1,n,1);
 }
}st;
int main(){
 int n,m;
 while(scanf("%d%d",&n,&m)==2){
 st.init(n);
 st.cc();
 for(int i=1;i<=n;i++){
  int tmp;
  scanf("%d",&tmp);
  st.Insert(i,tmp);
 }
 for(int i=1;i<=m;i++){
  char c;
  int o,e;
  while(scanf("%c",&c) && !isupper(c));
  scanf("%d%d",&o,&e);
  if(c==‘Q‘) printf("%d\n",st.Query(o,e));
  else st.Insert(o,e);
 }}
 return 0;
}

时间: 2024-11-06 22:57:59

hdu1754:I Hate It的相关文章

Oracle 11g数据库详解(2015-02-28更新)

Oracle 11g数据库详解 整理者:高压锅 QQ:280604597 Email:[email protected] 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 1   简介 数据库操作主要有以下几步: 1.  启动.停止数据库 2.  连接.断开数据库 3.  创建.修改.删除数据库用户 4.  表空间 5.  新建.修改.删除表 6.  查询.插入.修改.删除表数据 7.  新建.修改.删除视图 8.  新建.修改.删除存储过程 9.  新建.修改.删除触发

HDU1754 I Hate It splay

题意:单等更新,区间求最值. 解题思路:splay . 解题代码: 1 // File Name: hdu1754.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月03日 星期五 22时06分59秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #inc

hdu1754 单点更新

第二道线段树,哈哈哈,已经从区间求和萌萌哒变成求最大值,我是不是好无聊哦~~~~ 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int maxn = 200000 + 10; 10 int a[maxn]

hdu1754(线段数维护区间最大值)

题意:给定1-n(n<=200000)个数,然后动态改变一些值,并动态询问区间最大值. 解法:裸的线段树,赛前默写模版回忆下线段树代码.仍然要注意:线段树节点数组一定要开到节点数的三倍长度. 代码: /****************************************************** * author:xiefubao *******************************************************/ #pragma comment(lin

I Hate It(HDU1754)

Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束.在每个测试的第一行,有两个正整数 N 和 M (0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目.学生ID编号分别从1编到N.第二行包含N个整

hdu1754 I Hate It (简单线段树应用)

题目连接:hdu1754 I Hate It 本题考查的是线段树的基本操作.如果不懂线段树的基本操作请移步:这里 这一题是我学完线段树后的第一道线段树的题,可以说是十分的基础,我刚学完就可以一遍AC.大家只要对线段树的基本操作有所了解,应该是可以轻松AC的. 代码如下: // 有效结点: 200000 // 深度达到:(lg200000)/(lg2) +1 约等于 19 // 其完全二叉树 总结点 个数为: (1<<19) - 1 个 #include <stdio.h> #def

线段树(自敲:建树,查找最大值,更新结点值)

HDU1754 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int MaxSIZE = 2e6 + 10; 6 7 typedef struct { 8 int Max ; 9 int left, right ; 10 } NODE ; 11 12 int n, m ; 13 int num [MaxSIZE] ; 14 NODE tree[MaxSIZE * 20] ; 15 16 17 int build (i

安装Windows7系统时,提示:缺少所需的CD/DVD驱动器设备驱动程序

      测试机型:HP probook 430 g3       系统:Windows 7 Pro x64 现在笔记本电脑主板集成的USB口大多为3.0版本,而且一些厂商为了追求PC的轻薄,不再集成光驱,所以我们在安装系统时,一般只能通过U盘或U口外接光驱. 而当我们因为需要(安装OEM系统),在通过刻录软件(如UltraISO)将系统写入U盘或光盘的方式安装系统时,此时问题就可能悄悄出现了:因为Win7官方原版系统没有集成USB3.0驱动,所以可能的报错如下: 点击"浏览"或通过

solr分布式索引【实战一、分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例】

1 private static Properties prop = new Properties(); 2 3 private static String confFilePath = "conf" + File.separator + "config.properties";// 配置文件目录 4 static { 5 // 加载properties 6 InputStream is = null; 7 InputStreamReader isr = null;