zoukankan      html  css  js  c++  java
  • hdu 3308

    终于A了,我好想砍人,虽然这是一道基础的区间合并。但是这错误我也是醉了。

    错误我表在注释里。

    题目意思不多说,sha崽题目出的很简洁。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    const int maxn=100010;
    int lsum[maxn<<2],rsum[maxn<<2],msum[maxn<<2],p[maxn];
    struct node {
    int x,y;
    } cover[maxn<<2];
    void pushup(int l,int r,int rt)
    {
    cover[rt].x=cover[rt<<1].x;
    cover[rt].y=cover[rt<<1|1].y;
    lsum[rt]=lsum[rt<<1];
    rsum[rt]=rsum[rt<<1|1];
    msum[rt]=max(msum[rt<<1],msum[rt<<1|1]);
    int mid=(l+r)>>1;
    if(cover[rt<<1].y<cover[rt<<1|1].x)
    {
    if(lsum[rt]==mid-l+1)
    lsum[rt]+=lsum[rt<<1|1];
    if(rsum[rt]==r-mid)
    rsum[rt]+=rsum[rt<<1];
    msum[rt]=max(rsum[rt<<1]+lsum[rt<<1|1],msum[rt]);
    }
    }
    void build(int l,int r,int rt)
    {
    if(l==r)
    {
    msum[rt]=lsum[rt]=rsum[rt]=1;
    cover[rt].x=cover[rt].y=p[l];
    return ;
    }
    int mid=(l+r)>>1;
    build(lson);
    build(rson);
    pushup(l,r,rt) ;
    }
    void update(int xx,int yy,int l,int r,int rt)
    {
    if(l==r)
    {
    cover[rt].x=cover[rt].y=yy;
    return ;
    }
    int mid=(l+r)>>1;
    if(xx<=mid)
    update(xx,yy,lson);
    else
    update(xx,yy,rson);
    pushup(l,r,rt);
    }
    int query(int L,int R,int l,int r,int rt)//错就错在这个查找
    {
    if(L<=l&&r<=R)
    return msum[rt];
    int mid=(l+r)>>1;
    int ans = 0; //就错在这,ans要初始化0
    if(L<=mid)ans = query(L,R,lson);
    if(R>mid)ans = max ( ans, query(L,R,rson) );
    if(cover[rt<<1].y<cover[rt<<1|1].x)ans=max ( ans , min(mid-L+1, rsum[rt<<1])+min(R-mid,lsum[rt<<1|1]) );
    return ans;
    }
    int main()
    {
    int n,m,t;
    scanf("%d",&t);
    while(t--)
    {
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)scanf("%d",&p[i]);
    build(0,n-1,1);

    int a,b;
    char op[5];
    while(m--)
    {
    scanf("%s%d%d",op,&a,&b);//printf("%d %d ",a,b);
    if(*op=='Q')printf("%d ",query(a,b,0,n-1,1));
    else update(a,b,0,n-1,1);
    //for(int i=1;i<=5;i++)printf("%d %d %d %d %d ",cover[i].x,cover[i].y,lsum[i],rsum[i],msum[i]);
    }
    }
    }

    下面我把为什么不把ans初始化的问题写一下。

    比如原序列是1 2 3 那么要查找 【1 ,2】 区间的话。

    看图

    反正意思就差不多这样吧,但是好像图上这种情况是不返回数的,所以ans是系统随机给的一个数。

  • 相关阅读:
    MySQL根据父ID排序类别
    isNotBlank的用法
    IDEA中的.iml文件和.idea文件夹
    java组件:获取查询月份的第一天和最后一天,默认取当前月份
    MyBatis:条件构造器QueryWrapper方法详解
    querywrapper条件构造器
    mybatisplus主键策略选择
    mybatis-plus 高级搜索分页功能的实现 sql语句 QueryWrapper 条件判断
    QueryWrapper查询
    MySQL根据父ID排序类别(mysql sort category according to parent id)
  • 原文地址:https://www.cnblogs.com/newadi/p/4066098.html
Copyright © 2011-2022 走看看