I Hate It
Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
学生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 <iostream> using namespace std; const int maxn=200010; int max(int a,int b) { int c=a>b?a:b; return c; } struct Node { int left; int right; int max; }; Node node[maxn*3]; //一般开3倍 void Build(int l,int r,int id) { node[id].left =l; node[id].right =r; node[id].max =0; if (node[id].left == node[id].right) { return ; } int mid=(l+r)/2; Build(l,mid,2*id); Build(mid+1,r,2*id+1); } void Update(int id,int key,int num) { int l=node[id].left ; int r=node[id].right ; int mid=(l+r)/2; if (l==key && r==key) { node[id].max =num; return ; } if (node[id].max <num) //从上而下更新max node[id].max =num; if (key<=mid) { Update(2*id,key,num); //左子树更新 } else if (key>mid) //右字树更新 { Update(2*id+1,key,num); } } int Find(int id,int x,int y) { int l=node[id].left ; int r=node[id].right ; int mid=(l+r)/2; int ans=0; if (l==x && r==y) { return node[id].max ; } if (y<=mid) //在左子树时 { ans=Find(id*2,x,y); } else if (x>mid) //在右子树时 { ans=Find(id*2+1,x,y); } else //两边都在的时候,分割成两半 { ans=max(Find(id,x,mid),Find(id,mid+1,y)); } return ans; } int main() { int N,M; while (~scanf("%d%d",&N,&M)) { int t; Build(1,N,1); for (int i=1;i<=N;i++) { scanf("%d",&t); Update(1,i,t); } char c; int a,b; for (i=1;i<=M;i++) { // getchar(); scanf("%c%d%d",&c,&a,&b); if (c=='Q') { int ans=Find(1,a,b); printf("%d\n",ans); } if (c=='U') { Update(1,a,b); } } } return 0; }
学生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
Author
Source
2007省赛集训队练习赛(6)_linle专场