I Hate It(线段树点更新)
来源:互联网 发布:C语言value是什么函数 编辑:程序博客网 时间:2024/05/16 08:16
I Hate It
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 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'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
在每个测试的第一行,有两个正整数 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'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
Output
对于每一次询问操作,在一行里面输出最高成绩。
Sample Input
5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
Sample Output
5659
Hint
Huge input,the C function scanf() will work better than cin
线段树点更新裸题
//#pragma comment(linker, "/STACK:102400000,102400000"#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<ctime>#define eps 1e-6#define MAX 200005#define INF 0x3f3f3f3f#define LL long long#define pii pair<int,int>#define rd(x) scanf("%d",&x)#define rd2(x,y) scanf("%d%d",&x,&y)#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)using namespace std;int a[MAX];///存储结点的位置struct node{ int left,right;///线段区间 int sum;///区间上的人数}b[MAX*3];void Build(int left,int right,int i){///建树 b[i].left=left,b[i].right=right; if(left==right){///先用数组存下该队的人 b[i].sum=a[left]; return ; } int mid=(left+right)/2; Build(left,mid,2*i);///递归建立左子树 Build(mid+1,right,2*i+1);///递归建立右子树 b[i].sum=max(b[2*i].sum,b[2*i+1].sum);///记录该结点左右子树的值}void updata(int j,int num,int i){ ///修改树 自上而下修改 if(b[i].left==b[i].right)///到达叶子结点 b[i].sum=num; else{ j<=b[i*2].right ? updata(j,num,2*i) : updata(j,num,2*i+1); ///递归左子树///建立右子树 b[i].sum=max(b[i<<1].sum,b[i<<1|1].sum); }}int Query(int left,int right,int i){///查询 int mid; if( b[i].left==left && b[i].right==right ) return b[i].sum; mid=(b[i].left+b[i].right)/2; if(right<=mid) return Query(left,right,2*i);///在左子树 else if(left>mid) return Query(left,right,2*i+1);///在右子树 else return max(Query(left,mid,2*i),Query(mid+1,right,2*i+1));///否则在中间,跨越树的两个分支}int main(){ int j,num,n,m,coun=0; char s[10]; while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); Build(1,n,1);///建树 1作为根 for(int i=0;i<m;i++){ scanf("%s",s); ///操作 scanf("%d%d",&j,&num); if(!strcmp(s,"Q")) printf("%d\n",Query(j,num,1)); if(!strcmp(s,"U")) updata(j,num,1);///从根结点开始 } } return 0;}
0 0
- I Hate It(线段树点更新)
- 线段树-I Hate It (点更新,求点)
- HDU 1754 I Hate It 线段树 最大值 点更新
- hdu1754 I Hate It (线段树 更新点的值)
- I Hate It (线段树点更新)
- hdu1754 I Hate It(线段树点的更新和区间查找)
- HDU-1754-I Hate It(线段树 点更新求最值)
- hdu 1754 I Hate It(线段树 点更新 最大值)
- HDU1754-线段树(点更新区间查询)-I Hate It
- I Hate It (线段树)
- 线段树:I Hate It
- i hate it 线段树
- I Hate It 【线段树】
- I Hate It---线段树
- I hate it --线段树
- I Hate It (线段树)
- 线段树i hate it
- I Hate It(线段树)
- 笔记10:IPAddress 类、IPInterfaceProperties 类、IPGlobalProperties 类
- bzoj 3280(费用流)
- n个数的和为n个数的公倍数
- 句子的逆序
- go语言学习,了解go语言已经2个月了。学学放放根本就没有进步
- I Hate It(线段树点更新)
- “洗牌”算法
- ZOJ 3702 Gibonacci number【思维】
- python源码解析笔记--List
- 30条Android开发建议
- 【史上最强】网上所有的Axure元器件、UI、8.0安装包汉化包资源汇总
- python 2.7 中 PIL库安装问题
- POJ3187 Backward Digit Sums 全排列经典题目
- Spark笔记简单实例演示