传送门

ODT水题。

支持区间01赋值,区间填补(把区间[l,r][l,r][l,r]从左往右数kkk个1都变成0),区间查询最长连续1个数。


思路:

区间填补操作感觉不是很好弄,写线段树的神仙可以套一个二分来写。

而对于写odtodtodt的朋友们来说就很easyeasyeasy了,直接从左往右遍历到第kkk个1所在区间覆盖一波即可(详见代码)。

不会ODTODTODT的点这里

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
struct Node{
    int l,r;
    mutable int v;
    Node(int l,int r=-1,int v=0):l(l),r(r),v(v){}
    friend inline bool operator<(const Node&a,const Node&b){return a.l<b.l;}
};
set<Node>S;
typedef set<Node>::iterator It;
inline It split(int pos){
    It it=S.lower_bound(pos);
    if(it!=S.end()&&it->l==pos)return it;
    --it;
    if(pos>it->r)return S.end();
    int l=it->l,r=it->r,v=it->v;
    return S.erase(it),S.insert(Node(l,pos-1,v)),S.insert(Node(pos,r,v)).first;
}
inline void assign(int l,int r,int v){
    It R=split(r+1),L=split(l);
    S.erase(L,R),S.insert(Node(l,r,v));
}
inline int query(int l,int r){
    It R=split(r+1),L=split(l);
    int ret=0,sum=0;
    for(It it=L;it!=R;++it)sum=it->v?(sum+it->r-it->l+1):0,ret=max(ret,sum);
    return ret;
}
inline int qsum(int l,int r){
    It R=split(r+1),L=split(l);
    int ret=0;
    for(It it=L;it!=R;++it)ret+=(1-it->v)*(it->r-it->l+1);
    return S.erase(L,R),S.insert(Node(l,r,1)),ret;
}
inline void update(int l,int r,int k){
    if(!k)return;
    if(k>=r-l+1){assign(l,r,0);return;}
    It it,R=split(r+1),L=split(l);
    for(It it=L;it!=R&&k;++it){
        if(it->v){
            k-=it->r-it->l+1;
            if(k<0){assign(it->l,it->r+k,0);return;}
            else it->v=0;
        }
    }
}
int main(){
    S.insert(Node(1,read(),0));
    for(ri op,l,r,x,y,v,tt=read();tt;--tt){
        op=read(),l=read(),r=read();
        switch(op){
            case 0:assign(l,r,1);break;
            case 1:{
                x=read(),y=read(),update(x,y,qsum(l,r));
                break;
            }
            default:cout<<query(l,r)<<'\n';
        }
    }
    return 0;
}

2019.01.19 bzoj4592: [Shoi2015]脑洞治疗仪(ODT)的更多相关文章

  1. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  2. 洛谷P4344 [SHOI2015]脑洞治疗仪(ODT)

    题意 题目链接 Sol ODT板子题. 操作1直接拆区间就行. #include<bits/stdc++.h> #define fi first #define se second con ...

  3. [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)

    线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区 ...

  4. BZOJ4592 SHOI2015脑洞治疗仪(线段树)

    考虑需要资瓷哪些操作:区间赋值为0:统计区间1的个数:将区间前k个0变为1:询问区间最长全0子串.于是线段树维护区间1的个数.0的个数.最长前缀后缀全0子串即可.稍微困难的是用一个log实现将区间前k ...

  5. [bzoj4592] [Shoi2015]脑洞治疗仪

    题面无法直视系列. 中规中矩的线段树题. 涉及的操作有:区间赋值为0,计算区间内1的个数,区间赋值为1,求区间内最大的连续的1的个数. #include<cstdio> #include& ...

  6. 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树

    [BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...

  7. 【BZOJ-4592】脑洞治疗仪 线段树

    4592: [Shoi2015]脑洞治疗仪 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 69  Solved: 38[Submit][Status] ...

  8. 【题解】Luogu P4344 [SHOI2015]脑洞治疗仪

    原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 ...

  9. [SHOI2015]脑洞治疗仪(恶心的线段树,区间最大子段和)

    题目描述: 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.11代表这个位 ...

随机推荐

  1. .net 报错access to the path c:\tempimagefiles\msc_cntr_0.txt is denied

    报错信息: 解决方法: 在 Web.Config 的 <System.Web> 里加 <identity impersonate="true"/> 节点即可 ...

  2. ConcurrentMap与CopyOnWrite容器

    ConcurrentMap接口下有两个重要的实现: ConcurrentHashMap ConcurrentSkipListMap(支持并发排序功能,弥补ConcurrentHashMap) Conc ...

  3. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (贪心或有源汇上下界网络流)

    "Oh, There is a bipartite graph.""Make it Fantastic."X wants to check whether a ...

  4. [CodeForces_618C]Constellation

    题目链接 http://codeforces.com/problemset/problem/618/C 题意 给二维平面一些点的坐标,保证不是所有点都在一条直线上,各点不重合,输出三个点的id,满足其 ...

  5. xcode - pod install 出现错误

    xcode 10 上pod install 出现错误 error: /Users/apple/Desktop/VenusClient/Pods/Pods/Target Support Files/Po ...

  6. gRPC的.netClient客户端第一次连接出现StatusCode=Unavailable的解决办法?

    1.问题还原: The service does not automatically connect, free after a period of time, the first call will ...

  7. vue2.0插件

    1.better-scroll 参考网址:https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/ better-scroll 是什么 firs ...

  8. VSS源代码管理器运行代码分析工具的命令

    当你发现代码库总是报需要联系管理员运行代码分析工具时,你可以使用命令分析代码库代码解决: To fix the database problems, you can restart the analy ...

  9. 18.Mysql SQL优化

    18.SQL优化18.1 优化SQL语句的一般步骤 18.1.1 通过show status命令了解各种SQL的执行频率show [session|global] status; -- 查看服务器状态 ...

  10. Oracle_PL/SQL(5) 包

    包1.定义:包用于逻辑组合相关的PL/SQL类型,项和子程序,由包规范和包体组成 建立包规范:包规范是包与应用程序之间的接口,用于定义包的公用组件, 包括常量,变量,游标,过程,函数等 建立包体:用于 ...