标签:树状数组 function title 递推 mod highlight cells 算法 har
输入包括多组测试数据。 每组输入第一行是两个正整数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。
对于每一次询问操作,在一行里面输出最高成绩.
5 7 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 4 5 U 2 9 Q 1 5
5 6 5 9
分析:
这个题目树状数组线段树都是OK的,但是没有涉及到对区间的操作,树状数组在时间和空间上面的代价都要小很多。
牛客网题解:
暴力,线段树,块状链表
链接:https://www.nowcoder.com/questionTerminal/3897c2bcc87943ed98d8e0b9e18c4666
来源:牛客网
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include <stdio.h>#include <algorithm>using namespace std;const int MAXN=100000;int data[MAXN+5];int querymax ( int l , int r ) { int ans=data[l]; for(int i=l+1;i<=r;i++) ans=max(ans,data[i]); return ans;}void update(int idx,int value){ data[idx]=value;}int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++){ scanf("%d",&data[i]); } char order; int a,b; for(;m--;){ scanf(" %c%d%d",&order,&a,&b); if(order==‘U‘){ update(a,b); }else if(order==‘Q‘){ if(a>b)swap(a,b); printf("%d\n",querymax(a,b)); } } } return 0;} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include <stdio.h>#include <algorithm>using namespace std;const int MAXN=100000;int data[MAXN+5];int maxarr[MAXN*4+5];void build(int p,int l,int r) { if(l==r){ maxarr[p]=data[l]; return ; } int m = ( l + r ) >> 1 ; int lchild=p<<1,rchild=p<<1|1; build ( lchild , l , m ) ; build ( rchild , m+1 , r ) ; maxarr[p]=max(maxarr[lchild],maxarr[rchild]);}int querymax ( int L , int R , int p , int l , int r ) { if ( L <= l && r <= R ) { return maxarr[p]; } int m = ( l + r ) >> 1 ; int lans=-1,rans=-1; if ( L <= m ) lans=querymax ( L , R , p << 1 , l , m ) ; if ( m < R ) rans=querymax ( L , R , p << 1 | 1 , m + 1 , r ) ; if(lans==-1)return rans; if(rans==-1)return lans; return max(lans,rans);}void update(int idx,int value,int p,int l,int r){ if(l==r&&l==idx){ maxarr[p]=value; return; } int m = ( l + r ) >> 1 ; if ( idx <= m ) update( idx, value, p << 1, l, m ); if ( m < idx ) update( idx, value, p << 1|1, m+1, r ); maxarr[p]=max(maxarr[p<<1],maxarr[p<<1|1]);}int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++){ scanf("%d",&data[i]); } build(1,1,n); char order; int a,b; for(;m--;){ scanf(" %c%d%d",&order,&a,&b); if(order==‘U‘){ update(a,b,1,1,n); }else if(order==‘Q‘){ if(a>b)swap(a,b); printf("%d\n",querymax(a,b,1,1,n)); } } } return 0;} |
标签:树状数组 function title 递推 mod highlight cells 算法 har
原文地址:http://www.cnblogs.com/Renyi-Fan/p/7779097.html