标签:
Description
Input
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
解释:这题主要意思难点在如何花较少时间去取得一段学生的最高成绩和如何更新某个学生的成绩。所以此题,有以下思路:
1.在构建每个线段树的时候,除了最下面的一排,每一个支点都储存下面左孩子和右孩子的最大值(不是和),这样的话读取某段学生
成绩最大值就会快很多。
2.因为每次跟新某位学生成绩时,上面的支点肯定也要做相应改变,所以用到了递归思想从下到上更新成绩。
下面是代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define max(a,b) (a > b ? a : b) 5 #define min(a,b) (a > b ? b : a) 6 7 using namespace std; 8 9 const int MAXN=200010; 10 11 struct student 12 { 13 int left,right; 14 int nSum; 15 }segTree[MAXN*3]; 16 int num[MAXN]; 17 18 19 20 21 void Build(int i,int left,int right)//递归算法,构建一颗线段树 22 { 23 segTree[i].left=left; 24 segTree[i].right=right; 25 if(left==right) 26 { 27 segTree[i].nSum=num[left]; 28 return; 29 } 30 int mid=(left+right)>>1;//除2 31 Build(i<<1,left,mid);//i*2 a 32 Build(i<<1|1,mid+1,right);//i*2+1 b 33 segTree[i].nSum=(segTree[i<<1].nSum>segTree[i<<1|1].nSum?segTree[i<<1].nSum:segTree[i<<1|1].nSum); //取最大值 34 } 35 36 37 void U(int i,int tleft,int b)//更新成绩 38 { 39 40 if(segTree[i].left==tleft&&segTree[i].right==tleft) 41 { 42 segTree[i].nSum=b; 43 return; 44 } 45 int mid=(segTree[i].left+segTree[i].right)>>1; 46 47 if(tleft<=mid) 48 U(i<<1,tleft,b); 49 else 50 U(i<<1|1,tleft,b); 51 52 segTree[i].nSum=(segTree[i].nSum>b?segTree[i].nSum:b); 53 54 } 55 56 57 int Q(int i,int left,int right) 58 { 59 if(segTree[i].left==left&&segTree[i].right==right) 60 { 61 return segTree[i].nSum; 62 } 63 int middle=(segTree[i].left+segTree[i].right)>>1; 64 if(left>middle) 65 { 66 return Q(i<<1|1,left,right); 67 } 68 else if(right<=middle) 69 { 70 return Q(i<<1,left,right); 71 } 72 else 73 { 74 int a=Q(i<<1,left,middle); 75 int b=Q(i<<1|1,middle+1,right); 76 return a>b?a:b; 77 } 78 } 79 80 81 int main() 82 { 83 int n,t,x,y; 84 char C; 85 while(scanf("%d%d",&n,&t)!=EOF){ 86 for(int i=1; i<= n; i++)scanf("%d",&num[i]); 87 Build(1,1,n); 88 while(t--){ 89 getchar(); //吸收掉多余的换行键 90 scanf("%c%d%d",&C,&x,&y); 91 92 if(C == ‘U‘) 93 U(1,x,y); 94 else 95 printf("%d\n",Q(1,x,y)); 96 } 97 } 98 return 0; 99 }
标签:
原文地址:http://www.cnblogs.com/shadervio/p/5696908.html