zoukankan      html  css  js  c++  java
  • 最高分

    输入包含多组测试数据。
    每组输入第一行是两个正整数N和M(0<N<=30000,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。

    #include<bits/stdc++.h>

    using namespace std;

    struct node

    {

             int l,r,f;int zhi;

    }a[120001];

    int n,m,b[30001],x,y,z;char u;

    void build(int k,int l,int r)

    {

             a[k].l=l;a[k].r=r;

             if(l==r)

             {

                       a[k].zhi=b[l];

                       return;

             }

             int mid=(l+r)/2;

             build(k*2,l,mid);

             build(k*2+1,mid+1,r);

             a[k].zhi=max(a[k*2].zhi,a[k*2+1].zhi);

    }

    void add(int k,int x,int zhi)

    {

             if(a[k].l==a[k].r)

             {

                       a[k].zhi=zhi;

                       return;

             }

             int mid=(a[k].l+a[k].r)/2;

             if(mid>=x)

             {

                       add(k*2,x,zhi);

             }

             else

             add(k*2+1,x,zhi);

             a[k].zhi=max(a[k*2].zhi,a[k*2+1].zhi);

    }

    int find(int k,int l,int r)

    {

             if(a[k].l>=l&&a[k].r<=r)

             {

                       return a[k].zhi;

             }

             int ans=-199009999,mid=(a[k].l+a[k].r)/2;

             if(mid>=l)

             {

                       ans=max(ans,find(k*2,l,r));

             }

             if(mid<r)

             {

                       ans=max(ans,find(k*2+1,l,r));

             }

             return ans;

    }

    int main()

    {

             while(cin>>n>>m)

             {

                       memset(b,0,sizeof(b));

                       memset(a,0,sizeof(a));

                       for(int i=1;i<=n;i++)

                       {

                                cin>>b[i];

                       }

                       build(1,1,n);

                       for(int i=0;i<m;i++)

                       {

                                cin>>u;

                                if(u=='U')

                                {

                                         cin>>x>>y;

                                         add(1,x,y);

                                }

                                if(u=='Q')

                                {

                                         cin>>x>>y;

                                         cout<<find(1,x,y)<<endl;

                                }

                       }

             }

    }

  • 相关阅读:
    远程连接mysql root账号报错:2003-can't connect to MYSQL serve
    php定位并且获取天气信息
    PHP Ajax 跨域问题最佳解决方案
    AngularJS 过滤器
    AngularJS自定义指令及指令配置项
    php获取微信的openid
    SVN服务器
    redis的LRU策略理解
    golang入门案例之http client请求
    golang入门案例之SOCKET
  • 原文地址:https://www.cnblogs.com/fanhao050109/p/10939396.html
Copyright © 2011-2022 走看看