zoukankan      html  css  js  c++  java
  • HDU-1754-I Hate It(线段树,简单,不过好像有点问题)

    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=1754

    题目不难,不过开始我犯了一个低级错误,输入n,m,m代表操作的数目,我没有写了,写代码的时候,就感觉有问题,不过那时不知怎么的了,糊涂了,

    就是while(m--)我没有写了,就错了,我一直在考虑,哪里错了想了很久,一直WA 后来看了一遍题目才知道犯了一个如此低级,改了,AC,不过,在想

    为什么WA的时候,我想到一个问题,就是如果把最大的改成很小,即小于第二大的就可以了,那输出的时候还是那个最大的我举个例子。

    例如:

    我的AC代码,测出来的数据

    输入:

    4 3

    1 2 3 4

    Q 1 4

    U 4 2

    Q 1 4

    输出

    4

    4

    按题目意思输出应该为

    输出

    4

    3

    但是

    输出

    4

    4

    的过了,难道是题目的测试数据,不够全面吗?

    要是输出该为

    输出

    4

    3

    的话 要如何做呢,我想了一下,还没想出来,谁想出来了,多多指教,将感激不尽!

    把最大的改成很小,即小于第二大的就可以了,那么如何更新最大的了呢!//只有这里会出问题 ,其他的地方没有。

    我的AC代码

    #include<stdio.h>

    #include<iostream>

    #define MAXSIZE 200005 using namespace std;

    struct node

    {    

    int left,right,m;

    }tree[MAXSIZE*4];

    void build(int node,int left,int right)

    {    

    tree[node].left=left;    

    tree[node].right=right;    

    tree[node].m=0;    

    if(left==right)    

    return ;    

    int mid=(left+right)/2;    

    build(node*2,left,mid);    

    build(node*2+1,mid+1,right);

    }

    void update(int node,int pos,int val)

    {    

    tree[node].m=max(val,tree[node].m);    

    if(tree[node].left==pos&&tree[node].right==pos)    

    return ;    

    int mid=(tree[node].left+tree[node].right)/2;    

    if(pos<=mid)     update(node*2,pos,val);    

    else    

    update(node*2+1,pos,val);

    }

    int query(int node,int left,int right)

    {    

    if(tree[node].left==left&&tree[node].right==right)    

    return tree[node].m;    

    int mid=(tree[node].left+tree[node].right)/2;    

    if(right<=mid)    

    return query(node*2,left,right);    

    else if(left>mid)    

    return query(node*2+1,left,right);    

    else    

    return max( query(node*2,left,mid), query(node*2+1,mid+1,right) );

    }

    int main(void)

    {    

    int n,m,i,j,k,l;    

    int x,y;    

    char c;    

    while(scanf("%d%d",&n,&m)==2)    

    {        

    build(1,1,n);        

    for(i=1;i<=n;i++)        

    {            

    scanf("%d",&x);            

    update(1,i,x);        

    }        

    getchar();       

    while(m--)        

    {            

    scanf("%c",&c);            

    scanf("%d%d",&x,&y);            

    getchar();            

    if(c=='Q')            

    {                

    printf("%d ",query(1,x,y));            

    }            

    else if(c=='U')            

    {                

    update(1,x,y);            

    }        

    }    

    }    

    return 0;

    }

  • 相关阅读:
    SVN上新增一个项目和用户
    Linux增加swap分区的方法
    FPGA研发之道(25)-管脚
    altera tcl
    信号处理的好书Digital Signal Processing
    每天逛一次官方论坛
    GTS、GCK,GSR全称
    altera tcl
    FPGA组成、工作原理和开发流程
    复杂可编程逻辑器件CPLD的基本结构
  • 原文地址:https://www.cnblogs.com/liudehao/p/3946597.html
Copyright © 2011-2022 走看看