P1531 I Hate It
题目背景
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。
题目描述
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩
输入输出格式
输入格式:
第一行,有两个正整数 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'的时候,表示这是一条更新操作,如果当前A学生的成绩低于B,则把ID为A的学生的成绩更改为B,否则不改动。
输出格式:
对于每一次询问操作,在一行里面输出最高成绩
输入输出样例
输入样例#1:
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
输出样例#1:
5 6 5 9
线段树区间查询+单点修改
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<algorithm> 7 #define ls k<<1 8 #define rs k<<1|1 9 using namespace std; 10 const int MAXN=2000001; 11 void read(int &n) 12 { 13 char c='+';int x=0;bool flag=0; 14 while(c<'0'||c>'9') 15 {c=getchar();if(c=='-')flag=1;} 16 while(c>='0'&&c<='9') 17 {x=x*10+c-48,c=getchar();} 18 flag==1?n=-x:n=x; 19 } 20 int n,m; 21 int ans=-1; 22 struct node 23 { 24 int l,r,w; 25 }tree[MAXN*4]; 26 void update(int k) 27 { 28 tree[k].w=max(tree[ls].w,tree[rs].w); 29 } 30 void build_tree(int ll,int rr,int k) 31 { 32 tree[k].l=ll;tree[k].r=rr; 33 if(ll==rr) 34 { 35 read(tree[k].w); 36 return ; 37 } 38 int mid=(ll+rr)>>1; 39 build_tree(ll,mid,ls); 40 build_tree(mid+1,rr,rs); 41 update(k); 42 } 43 void query(int ll,int rr,int k) 44 { 45 if(ll>tree[k].r||rr<tree[k].l) 46 return ; 47 if(ll<=tree[k].l&&tree[k].r<=rr) 48 { 49 ans=max(ans,tree[k].w); 50 return ; 51 } 52 int mid=(tree[k].l+tree[k].r)>>1; 53 query(ll,rr,ls); 54 query(ll,rr,rs); 55 } 56 void change(int pos,int v,int k) 57 { 58 if(pos>tree[k].r||pos<tree[k].l) 59 return ; 60 if(tree[k].l==tree[k].r) 61 { 62 tree[k].w=v; 63 return ; 64 } 65 change(pos,v,ls); 66 change(pos,v,rs); 67 update(k); 68 } 69 int main() 70 { 71 read(n);read(m); 72 build_tree(1,n,1); 73 for(int i=1;i<=m;i++) 74 { 75 string s; 76 cin>>s; 77 if(s[0]=='Q')// 查询 78 { 79 int l,r; 80 read(l);read(r); 81 ans=0; 82 query(l,r,1); 83 printf("%d\n",ans); 84 } 85 else 86 { 87 int x,y; 88 read(x);read(y); 89 ans=0; 90 query(x,x,1); 91 if(ans<y) 92 change(x,y,1); 93 } 94 } 95 return 0; 96 }
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。