zoukankan      html  css  js  c++  java
  • hdu1754 I Hate It 线段树

    很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
    这让很多学生很反感。

    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

    线段树裸题,单点修改,区间求最大值。

     1 #include<stdio.h>
     2 const int maxm=200005;
     3 
     4 int a[maxm],st[maxm<<2];
     5 char s[10];
     6 
     7 int max(int a,int b){
     8     return a>b?a:b;
     9 }
    10 
    11 void build(int o,int l,int r){
    12     if(l==r){
    13         st[o]=a[l];
    14         return;
    15     }
    16     int m=l+((r-l)>>1);
    17     build(o<<1,l,m);
    18     build(o<<1|1,m+1,r);
    19     st[o]=max(st[o<<1],st[o<<1|1]);
    20 }
    21 
    22 void update(int o,int l,int r,int x,int c){
    23     if(l==r){
    24         st[o]=c;
    25         return;
    26     }
    27     int m=l+((r-l)>>1);
    28     if(x<=m)update(o<<1,l,m,x,c);
    29     if(x>=m+1)update(o<<1|1,m+1,r,x,c);
    30     st[o]=max(st[o<<1],st[o<<1|1]);
    31 }
    32 
    33 int query(int o,int l,int r,int ql,int qr){
    34     if(ql<=l&&qr>=r)return st[o];
    35     int m=l+((r-l)>>1);
    36     int maxx=-0x3f3f3f3f;
    37     if(ql<=m)maxx=max(maxx,query(o<<1,l,m,ql,qr));
    38     if(qr>=m+1)maxx=max(maxx,query(o<<1|1,m+1,r,ql,qr));
    39     return maxx;
    40 }
    41 
    42 int read(){
    43     int x=0,d=1;
    44     char c=getchar();
    45     while((c>'9'||c<'0')&&c!='-')c=getchar();
    46     if(c=='-'){
    47         d=-1;
    48         c=getchar();
    49     }
    50     while(c>='0'&&c<='9'){
    51         x=x*10+c-'0';
    52         c=getchar();
    53     }
    54     return d*x;
    55 }
    56 
    57 int main(){
    58     int n,m;
    59     while(scanf("%d%d",&n,&m)!=EOF){
    60         int i;
    61         for(i=1;i<=n;i++)a[i]=read();
    62         build(1,1,n);
    63         for(i=1;i<=m;i++){
    64             scanf("%s",s);
    65             if(s[0]=='Q'){
    66                 int ql=read();
    67                 int qr=read();
    68                 printf("%d
    ",query(1,1,n,ql,qr));
    69             }
    70             else if(s[0]=='U'){
    71                 int x=read();
    72                 int c=read();
    73                 update(1,1,n,x,c);
    74             }
    75         }
    76     }
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    BZOJ 1002 轮状病毒
    poj_1952最大下降子序列,统计个数
    poj_3468线段树成段更新求区间和
    hdu_4707
    uva_644暴力加字典树解法
    正则表达式:处理文本内容中特定的字符串
    grep:文本搜索工具
    分析文本的工具:wc,sort,uniq,diff和patch
    按列抽取文本cut和合并文件paste
    显示文本前或后行内容:head,tail
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/6592297.html
Copyright © 2011-2022 走看看