最高分

博客介绍了学生成绩查询与更新的算法。输入包含多组测试数据,每组有学生数目和操作数目,可进行询问和更新操作。给出了相应的代码实现,包括构建、添加和查找函数,通过这些函数可完成成绩的查询与更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入包含多组测试数据。
每组输入第一行是两个正整数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;

                            }

                   }

         }

}

转载于:https://www.cnblogs.com/fanhao050109/p/10939396.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值