zoukankan      html  css  js  c++  java
  • hdu 1754 I Hate It

    I Hate It

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


    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
     
    View Code
     1 #include<stdio.h>
     2 #define max(a,b) a>b?a:b
     3 #define maxn 200010
     4 int num[maxn];
     5 int ans;
     6 struct Node
     7 {
     8       int max;
     9       int l,r;
    10 }node[maxn*4];
    11 void build_tree(int rt,int ll,int rr)
    12 {
    13       node[rt].l=ll;
    14       node[rt].r=rr;
    15       if(ll==rr)
    16       {
    17             node[rt].max=num[ll];
    18             return;
    19       }
    20 
    21       int mid=(ll+rr)/2;
    22       build_tree(rt*2,ll,mid);
    23       build_tree(rt*2+1,mid+1,rr);
    24       node[rt].max=max(node[rt*2].max,node[rt*2+1].max);
    25 
    26 }
    27 void update(int rt,int pos,int value)
    28 {
    29       int mid=(node[rt].l+node[rt].r)/2;
    30       if(node[rt].l==pos&&node[rt].r==pos)
    31       {
    32             node[rt].max=value;
    33       }
    34       else if(pos<=mid)
    35       {
    36             update(rt*2,pos,value);
    37       }
    38       else update(rt*2+1,pos,value);
    39       node[rt].max=max(node[rt].max,value);
    40 }
    41 void query(int rt,int s,int e)
    42 {
    43       if(node[rt].l==s&&node[rt].r==e)
    44       {
    45             ans=max(node[rt].max,ans);
    46             return;
    47       }
    48       int mid=(node[rt].l+node[rt].r)/2;
    49       if(e<=mid)
    50       {
    51             query(rt*2,s,e);
    52       }
    53       else if(s>mid)
    54       query(rt*2+1,s,e);
    55       else
    56       {
    57             query(rt*2,s,mid);
    58             query(rt*2+1,mid+1,e);
    59       }
    60 
    61 
    62 }
    63 int main()
    64 {
    65       int n,m;
    66       int i,x,y;
    67       char ch;
    68       while(~scanf("%d%d",&n,&m))
    69       {
    70 
    71             for(i=1;i<=n;i++)
    72             scanf("%d",&num[i]);
    73             build_tree(1,1,n);
    74             for(i=0;i<m;i++)
    75             {
    76                   getchar();
    77                   scanf("%c%d%d",&ch,&x,&y);
    78                   if(ch=='U')
    79                   update(1,x,y);
    80                   else if(ch=='Q')
    81                   {
    82                         ans=-1;
    83                         query(1,x,y);
    84                         printf("%d\n",ans);
    85                   }
    86             }
    87 
    88 
    89       }
    90 
    91 }
  • 相关阅读:
    AT24C0X I2C通信原理
    Windows文件夹、文件源代码对比工具--WinMerge
    SignalTap导致PCIe Read/Write卡死
    Windows CMD 支持ls命令
    何为内存模型(JMM)?
    何为内存重排序?
    何为安全发布,又何为安全初始化?
    Hibernate入门之many to many关系映射详解
    Hibernate入门之one to many关系映射详解
    Hibernate入门之one to one关系映射详解
  • 原文地址:https://www.cnblogs.com/1114250779boke/p/2769695.html
Copyright © 2011-2022 走看看