hdu 1754
Posted zquacm-875180305
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1754相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
直接线段树。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const int maxn=200006,maxm=5010; 6 int a[maxn],ans[maxm]; 7 struct{ 8 int lef,rig,sum; 9 } tree[maxn*4]; 10 int n, ANS; 11 12 int my_max(int x,int y) 13 { 14 return x>y?x:y; 15 } 16 17 void build(int x,int y,int now) 18 { 19 tree[now].lef=x; 20 tree[now].rig=y; 21 if(x==y){ 22 scanf("%d",&tree[now].sum); 23 return ; 24 } 25 int mid=(x+y)>>1; 26 build( x, mid, now<<1); 27 build( mid+1, y, now<<1|1); 28 tree[now].sum=my_max(tree[now<<1].sum,tree[now<<1|1].sum); 29 } 30 31 void add(int x,int y,int now,int goal,int add_num) 32 { 33 if(x==y){ 34 tree[now].sum=add_num; 35 return ; 36 } 37 int mid=(x+y)>>1; 38 if(goal<=mid){ 39 add( x, mid, now<<1, goal, add_num); 40 } 41 else{ 42 add( mid+1, y, now<<1|1, goal, add_num); 43 } 44 tree[now].sum=my_max(tree[now<<1|1].sum,tree[now<<1].sum); 45 } 46 47 void query(int x,int y,int now, int eachx,int eachy) 48 { 49 if(x>=eachx&&y<=eachy){ 50 ANS=my_max(ANS,tree[now].sum); 51 return ; 52 } 53 int mid=(x+y)>>1; 54 if(mid>=eachy){ 55 query( x, mid, now<<1, eachx, eachy); 56 } 57 else if(mid<eachx){ 58 query( mid+1, y, now<<1|1, eachx, eachy); 59 } 60 else{ 61 query( x, mid, now<<1, eachx, eachy); 62 query( mid+1, y, now<<1|1, eachx, eachy); 63 } 64 } 65 66 int main() 67 { 68 int m; 69 while( ~scanf("%d%d",&n,&m)){ 70 char order[10]; 71 int num=0; 72 build(1,n,1); 73 int x,y; 74 while(m--){ 75 scanf("%s",order); 76 scanf("%d%d",&x,&y); 77 if(order[0]==‘U‘) add(1,n,1,x,y); 78 if(order[0]==‘Q‘){ 79 ANS=0; 80 query( 1, n, 1, x, y); 81 ans[++num]=ANS; 82 } 83 } 84 for(int i=1;i<=num;i++){ 85 printf("%d ",ans[i]); 86 } 87 } 88 return 0; 89 }
以上是关于hdu 1754的主要内容,如果未能解决你的问题,请参考以下文章