传送门

线段树基本操作。

要求维护区间取min" role="presentation" style="position: relative;">minmin(给定一个数x" role="presentation" style="position: relative;">xx,让整个区间中的数都变成min(x,a[i])" role="presentation" style="position: relative;">min(x,a[i])min(x,a[i]))

然后是查询区间最大与区间和。

第一眼看到以为是max" role="presentation" style="position: relative;">maxmax和min" role="presentation" style="position: relative;">minmin直接剪枝,结果写了一发发现挂了,然后找到了一篇叫做segment" role="presentation" style="position: relative;">segmentsegment tree" role="presentation" style="position: relative;">treetree beats" role="presentation" style="position: relative;">beatsbeats的论文,%%%%%%%%%%%jiry2" role="presentation" style="position: relative;">jiry2jiry2,然后就学会了这种操作。

其实也就是维护区间最大和区间次大然后分类讨论。

如果当前的x" role="presentation" style="position: relative;">xx已经不小于区间最大值了直接返回,因为无法更新区间中任意一个节点。

如果当前的x" role="presentation" style="position: relative;">xx比区间次大值要大的话,说明只有区间最大值会被更新。这样我们还要维护一个区间中最大值的出现次数,方便更新。

如果x" role="presentation" style="position: relative;">xx比区间次大值还要小?递归更新吧。

论文中着重讲述了复杂度的证明。

代码如下:

#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline void write(ll x){
    if(x>9)write(x/10);
    putchar((x%10)^48);
}
int T_T,n,m;
struct Node{int l,r;ll cx,sum,mx,mxx;}T[N<<2];
inline ll max(ll a,ll b){return a>b?a:b;}
inline void pushup(int p){
    T[p].sum=T[lc].sum+T[rc].sum;
    T[p].mx=max(T[lc].mx,T[rc].mx);
    T[p].cx=(T[p].mx==T[lc].mx?T[lc].cx:0)+(T[p].mx==T[rc].mx?T[rc].cx:0);
    T[p].mxx=max(T[lc].mx==T[p].mx?T[lc].mxx:T[lc].mx,T[rc].mx==T[p].mx?T[rc].mxx:T[rc].mx);
}
inline void pushnow(int p,ll v){if(T[p].mx<=v)return;T[p].sum+=T[p].cx*(v-T[p].mx),T[p].mx=v;}
inline void pushdown(int p){pushnow(lc,T[p].mx),pushnow(rc,T[p].mx);}
inline void build(int p,int l,int r){
    T[p].l=l,T[p].r=r;
    if(l==r){T[p].cx=1,T[p].mxx=-1,T[p].mx=T[p].sum=read();return;}
    build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int ql,int qr,ll v){
    if(ql>T[p].r||qr<T[p].l||T[p].mx<=v)return;
    if(ql<=T[p].l&&T[p].r<=qr&&T[p].mxx<v){pushnow(p,v);return;}
    pushdown(p);
    if(qr<=mid)update(lc,ql,qr,v);
    else if(ql>mid)update(rc,ql,qr,v);
    else update(lc,ql,mid,v),update(rc,mid+1,qr,v);
    pushup(p);
}
inline ll query_max(int p,int ql,int qr){
    if(ql>T[p].r||qr<T[p].l)return 0;
    if(ql<=T[p].l&&T[p].r<=qr)return T[p].mx;
    pushdown(p);
    if(qr<=mid)return query_max(lc,ql,qr);
    if(ql>mid)return query_max(rc,ql,qr);
    return max(query_max(lc,ql,mid),query_max(rc,mid+1,qr));
}
inline ll query_sum(int p,int ql,int qr){
    if(ql>T[p].r||qr<T[p].l)return 0;
    if(ql<=T[p].l&&T[p].r<=qr)return T[p].sum;
    pushdown(p);
    if(qr<=mid)return query_sum(lc,ql,qr);
    if(ql>mid)return query_sum(rc,ql,qr);
    return query_sum(lc,ql,mid)+query_sum(rc,mid+1,qr);
}
int main(){
    T_T=read();
    while(T_T--){
        n=read(),m=read();
        build(1,1,n);
        while(m--){
            int op=read(),l=read(),r=read();
            switch(op){
                case 0:{ll v=read();update(1,l,r,v);break;}
                case 1:{write(query_max(1,l,r)),puts("");break;}
                default:{write(query_sum(1,l,r)),puts("");break;}
            }
        }
    }
    return 0;
}

2018.07.25 hdu5306Gorgeous Sequence(线段树)的更多相关文章

  1. 2018.07.22 codeforces750E(线段树维护状态转移)

    传送门 给出一个数字字串,给出若干个询问,询问在字串的一段区间保证出现2017" role="presentation" style="position: re ...

  2. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  3. 2018.07.25 bzoj3878: [Ahoi2014&Jsoi2014]奇怪的计算器(线段树)

    传送门 线段树综合. 让我想起一道叫做siano" role="presentation" style="position: relative;"&g ...

  4. Wow! Such Sequence!(线段树4893)

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  5. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  6. hdu4893Wow! Such Sequence! (线段树)

    Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...

  7. HDU 6047 Maximum Sequence(线段树)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...

  8. Codeforces 438D The Child and Sequence - 线段树

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...

  9. hdu 5828 Rikka with Sequence 线段树

    Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

随机推荐

  1. 集中化管理平台Saltstack安装配置

    salt是一个异构平台基础设置管理工具(虽然我们通常只用在Linux上),使用轻量级的通讯器ZMQ,用Python写成的批量管理工具,完全开源,遵守Apache2协议,与Puppet,Chef功能类似 ...

  2. Boost.Hana

    Boost.Hana Boost.Hana 是一个元编程的库.它为不同种类数据的集合以及类型的集合提供了容器和算法. #include <boost/hana.hpp> namespace ...

  3. Hibernate的一个问题object references an unsaved transient instance - save the transi5

    1 我做了一对多和多对一的双向关联关系,在User这一方@ManyToOne已经设置了级联Cascade,这样在测试程序中保存User时,Group也应该自动保存,为什么会抛出以下的异常: (我是按着 ...

  4. 吴裕雄 实战python编程(3)

    import requests from bs4 import BeautifulSoup url = 'http://www.baidu.com'html = requests.get(url)sp ...

  5. 一行转多行 及多行转一行的 hive语句

      注意 :|,: 是特殊符号,要用 "\\|", "\\;"来表示.   一行转多行 usertags 里面有很多项,每项之间以逗号分隔   create t ...

  6. .Spark Streaming(上)--实时流计算Spark Streaming原理介

    Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...

  7. 首届阿里巴巴在线技术峰会,9位大V演讲整理!

    https://yq.aliyun.com/articles/57826 感谢参加阿里巴巴在线技术峰会.7月19日的3场专家分享:Blink.Docker.电商互动:7月20日的云数据库十大经典案 例 ...

  8. Linux运维就业技术指导(九)期末架构考核

    一,毕业架构设计考核筹备 1.1,架构图模板示例 1.1.1 架构图(一)概述 本架构是4层lvs负载均衡给后方7层nginx反向代理: 业务进行了动静分离: 数据库前端有memcached缓存组,降 ...

  9. linux下set命令的参数及用法

    linux  set 命令 功能说明:设置shell. 语 法:set [+-abCdefhHklmnpPtuvx] 补充说明:用set 命令可以设置各种shell选项或者列 出shell变量.单个选 ...

  10. Linux 软件 安装到 /usr,/usr/local/ 还是 /opt 目录

    Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./u ...