• B


    来源hdu17544

    很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
    这让很多学生很反感。

    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

    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。

    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

    修改点的线段树,求最值的

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include <iomanip>
    #include<cmath>
    #include<float.h> 
    #include<string.h>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #define sf scanf
    #define pf printf
    #define scf(x) scanf("%d",&x)
    #define scff(x,y) scanf("%d%d",&x,&y)
    #define prf(x) printf("%d
    ",x) 
    #define mm(x,b) memset((x),(b),sizeof(x))
    #define rep(i,a,n) for (int i=a;i<n;i++)
    #define per(i,a,n) for (int i=a;i>=n;i--)
    typedef long long ll;
    const ll mod=1e9+7;
    const double eps=1e-8;
    const int inf=0x3f3f3f3f;
    using namespace std;
    const double pi=acos(-1.0);
    const int N=2e5+10;
    int a[N];
    struct tree
    {
    	int l,r,maxn;
    }tr[N<<2];
    void built_tree(int x,int y,int i)
    {
    		tr[i].l=x;
    		tr[i].r=y;
    		if(x==y)
    		tr[i].maxn=a[x];
    		else
    		{
    			int mid=(x+y)>>1;
    			built_tree(x,mid,i<<1);
    			built_tree(mid+1,y,i<<1|1);
    			tr[i].maxn=max(tr[i<<1].maxn,tr[i<<1|1].maxn);
    		}
    }
    int query_tree(int x,int y,int i)
    {
    	if(tr[i].l>=x&&tr[i].r<=y)
    	return tr[i].maxn;
    	int mid=(tr[i].l +tr[i].r)>>1;
    	if(x>mid)
    	return query_tree(x,y,i<<1|1);
    	else if(y<=mid)
    	return query_tree(x,y,i<<1);
    	else 
    	return max(query_tree(x,y,i<<1|1),query_tree(x,y,i<<1));
    }
    void update_tree(int a,int b,int i)
    {
    	if(tr[i].l==a&&tr[i].r==a)
    	tr[i].maxn=b;
    	else
    	{
    		int mid=(tr[i].l +tr[i].r )>>1;
    		if(a<=mid)
    		update_tree(a,b,i<<1);
    		else if(a>mid)
    		update_tree(a,b,i<<1|1); 
    		tr[i].maxn=max(tr[i<<1].maxn,tr[i<<1|1].maxn); 
    	}
    }
    int main()
    {
    	int n,m,x,y;
    	while(~scff(n,m))
    	{
    		rep(i,1,n+1) scf(a[i]);
    		built_tree(1,n,1);
    		while(m--)
    		{
    			char c;
    			cin>>c;
    			scff(x,y);
    			if(c=='Q')
    			prf(query_tree(x,y,1));
    			else
    			update_tree(x,y,1);
    		}
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    [公告] 置顶博客一览
    [公告] 关于花
    【题解】[SNOI2019] 纸牌
    [题解向] PAM简单习题
    [题解向] 带悔贪心泛做
    [题解向] Manacher简单习题
    java记录(2)
    java记录(1)
    js垃圾回收的机制
    盒子的计算
  • 原文地址:https://www.cnblogs.com/wzl19981116/p/9657088.html
Copyright © 2020-2023  润新知