当前位置:编程学习 > C/C++ >>

HDU1754:I Hate It(线段树单点更新)

Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
 
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
 
 
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 <stdio.h>  
#include <string.h>  
#include <algorithm>  
using namespace std;  
const int inf = 1<<30;  
  
int n,maxn;  
  
struct node  
{  
    int l,r,n;  
}a[1000000];  
  
void init()  
{  
    int i,k;  
    for(k = 1;k<n;k<<=1);  
    for(i = k;i<2*k;i++)  
    {  
        a[i].l = a[i].r = i-k+1;  
        a[i].n = -inf;  
    }  
    for(i = k-1;i>0;i--)  
    {  
        a[i].l = a[2*i].l;  
        a[i].r = a[2*i+1].r;  
        a[i].n = -inf;  
    }  
}  
  
void insert(int i,int x,int m)  
{  
    if(x>=a[i].l && x<=a[i].r && a[i].n<m)  
    a[i].n = m;  
    if(a[i].l == a[i].r)  
    return ;  
    int mid = (a[i].l+a[i].r)/2;  
    if(x>mid)  
    insert(2*i+1,x,m);  
    else  
    insert(2*i,x,m);  
}  
  
void find(int x,int y,int i)  
{  
    if(x == a[i].l && y == a[i].r)  
    {  
        if(maxn<a[i].n)  
        maxn = a[i].n;  
        return ;  
    }  
    if(a[i].l == a[i].r)  
    return ;  
    int mid = (a[i].l+a[i].r)/2;  
    if(x>mid)  
    find(x,y,2*i+1);  
    else if(y<=mid)  
    find(x,y,2*i);  
    else  
    {  
        find(x,mid,2*i);  
        find(mid+1,y,2*i+1);  
    }  
}  
  
int main()  
{  
    int m,i,j,k,x,y;  
    char str[5];  
    while(~scanf("%d%d",&n,&m))  
    {  
        init();  
        for(i = 1;i<=n;i++)  
        {  
            scanf("%d",&k);  
            insert(1,i,k);  
        }  
        for(i = 0;i<m;i++)  
        {  
            scanf("%s%d%d",str,&x,&y);  
            if(strcmp(str,"Q")==0)  
            {  
                maxn = -inf;  
                find(x,y,1);  
                printf("%d\n",maxn);  
            }  
            else  
            insert(1,x,y);  
        }  
    }  
  
    return 0;  
}  

 

 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,