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

    I Hate It

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


    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
     
    思路:线段树,一开始TLE了好几次,不知道为啥,最后比较的时候我用了个getmax函数,其他都一样,居然Accepted了,就不超时了。神奇。。。
    AC代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define L(x) (x << 1)
     4 #define R(x) (x << 1|1)
     5 #define MAX 200000
     6 typedef struct
     7 {
     8     int left;
     9     int right;
    10     int temp_max;
    11 }Node;
    12 Node node[3*MAX];
    13 int max;
    14 int getmax(int x,int y)
    15 {
    16     return x <y?y:x;
    17 }
    18 
    19 void build(int l,int r,int k)
    20 {
    21     node[k].left = l;
    22     node[k].right = r;
    23     node[k].temp_max = 0;
    24     if(l == r)
    25         return ;
    26     int mid = (l+r) >> 1;
    27     build(l,mid,L(k));
    28     build(mid+1,r,R(k));
    29 }
    30 
    31 void insert(int pos,int val,int k)
    32 {
    33     if(pos >= node[k].left && pos <= node[k].right)
    34     {
    35         node[k].temp_max = getmax(val,node[k].temp_max);
    36     }
    37     if(node[k].left == node[k].right)
    38         return ;
    39     if(pos < node[R(k)].left)
    40         insert(pos,val,L(k));
    41     else
    42         insert(pos,val,R(k));
    43 }
    44 
    45 int get_result(int l,int r,int k)
    46 {
    47     if(l == node[k].left && r == node[k].right)
    48     {
    49         return max = node[k].temp_max;
    50     }
    51     if(node[k].left == node[k].right)
    52         return max;
    53     if(r < node[R(k)].left)
    54         get_result(l,r,L(k));
    55     else if(l > node[L(k)].right)
    56         return get_result(l,r,R(k));
    57     else
    58         return max = getmax(get_result(l,node[L(k)].right,L(k)),get_result(node[R(k)].left,r,R(k)));
    59 }
    60 
    61 int main()
    62 {
    63     int n,m,i,j,k;
    64     char str[5];
    65     while(~scanf("%d%d",&n,&m))
    66     {
    67         build(1,n,1);
    68         memset(str,0,sizeof(str));
    69         for(i = 1;i <= n;i ++)
    70         {
    71             scanf("%d",&j);
    72             insert(i,j,1);
    73         }
    74         for(i = 1;i <= m;i ++)
    75         {
    76             scanf("%s",str);
    77             if(!strcmp(str,"Q"))
    78             {
    79                 max = 0;
    80                 scanf("%d%d",&j,&k);
    81                 get_result(j,k,1);
    82                 printf("%d
    ",max);
    83             }
    84             else
    85             {
    86                 scanf("%d%d",&j,&k);
    87                 insert(j,k,1);
    88             }
    89             memset(str,0,sizeof(str));
    90         }
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    python2文件转换为exe可执行文件
    pycharm下 os.system os.popen执行命令返回有中文乱码
    python 虚拟环境
    git commit之后,想撤销commit
    Android Dialog使用举例
    Builder模式在Java中的应用(转)
    AngularJS promise()
    给你一个承诺
    AngularJs 用户登录验证模块(demo)参考总结
    推荐 15 个 Angular.js 应用扩展指令(参考应用)
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3410306.html
Copyright © 2011-2022 走看看