zoukankan      html  css  js  c++  java
  • I Hate It(线段树点更新)

    I Hate It
    Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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 

    线段树点更新裸题

    //#pragma comment(linker, "/STACK:102400000,102400000"
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<queue>
    #include<stack>
    #include<string>
    #include<map>
    #include<set>
    #include<ctime>
    #define eps 1e-6
    #define MAX 200005
    #define INF 0x3f3f3f3f
    #define LL long long
    #define pii pair<int,int>
    #define rd(x) scanf("%d",&x)
    #define rd2(x,y) scanf("%d%d",&x,&y)
    #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    using namespace std;
    
    int a[MAX];///存储结点的位置
    struct node{
      int left,right;///线段区间
      int sum;///区间上的人数
    }b[MAX*3];
    
    
    void Build(int left,int right,int i){///建树
      b[i].left=left,b[i].right=right;
      if(left==right){///先用数组存下该队的人
        b[i].sum=a[left];
        return ;
      }
      int  mid=(left+right)/2;
      Build(left,mid,2*i);///递归建立左子树
      Build(mid+1,right,2*i+1);///递归建立右子树
      b[i].sum=max(b[2*i].sum,b[2*i+1].sum);///记录该结点左右子树的值
    }
    
    void updata(int j,int num,int i){  ///修改树  自上而下修改
      if(b[i].left==b[i].right)///到达叶子结点
        b[i].sum=num;
      else{
        j<=b[i*2].right ? updata(j,num,2*i) : updata(j,num,2*i+1); ///递归左子树///建立右子树
        b[i].sum=max(b[i<<1].sum,b[i<<1|1].sum);
      }
    }
    
    int Query(int left,int right,int i){///查询
      int mid;
      if( b[i].left==left && b[i].right==right ) return b[i].sum;
      mid=(b[i].left+b[i].right)/2;
      if(right<=mid) return Query(left,right,2*i);///在左子树
      else if(left>mid) return Query(left,right,2*i+1);///在右子树
      else return max(Query(left,mid,2*i),Query(mid+1,right,2*i+1));///否则在中间,跨越树的两个分支
    }
    
    int main()
    {
       int j,num,n,m,coun=0;
       char s[10];
        while(~scanf("%d%d",&n,&m)){
         for(int i=1;i<=n;i++)
           scanf("%d",&a[i]);
         Build(1,n,1);///建树 1作为根
         for(int i=0;i<m;i++){
          scanf("%s",s);  ///操作
          scanf("%d%d",&j,&num);
          if(!strcmp(s,"Q"))   printf("%d
    ",Query(j,num,1));
          if(!strcmp(s,"U")) updata(j,num,1);///从根结点开始
         }
        }
      return 0;
    }
    





  • 相关阅读:
    Android 画直线并实现拖动
    SpringBoot整合MyBatis
    SpringBoot集成JPA
    SpringBoot整合使用JdbcTemplate
    Hadoop下WordCount程序
    Linux中Hadoop的环境搭建
    大数据初始化环境
    Hibernate根据实体类自动创建表
    自定义MVC实现登录案例
    SSH(Spring Struts2 Hibernate)框架整合(注解版)
  • 原文地址:https://www.cnblogs.com/zswbky/p/6717963.html
Copyright © 2011-2022 走看看