原题传送门:P4344 [SHOI2015]脑洞治疗仪

前置芝士:珂朵莉树

窝博客里对珂朵莉树的介绍

没什么好说的自己看看吧

珂朵莉树好题啊

我一开始一直Re65

后来重构代码就ac了,或许是rp问题

线段树做法好像很慢啊

我的珂朵莉树吸氧后目测luogu最优解第二,不知最优解匿名大佬怎么写的

操作1:把区间推平成0,开脑洞???珂朵莉树基本操作

操作2:把区间中的1的数量统计一下并变成0,暴力去被修补脑洞的区间填补(细节看代码来理解)

操作3:查询区间中最长连续的1,暴力扫一遍就行

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define IT set<node>::iterator
using namespace std;
struct IO_Tp
{
static const int _I_Buffer_Size = 1 << 24;
char _I_Buffer[_I_Buffer_Size];
char* _I_pos;
static const int _O_Buffer_Size = 1 << 24;
char _O_Buffer[_O_Buffer_Size];
char* _O_pos;
IO_Tp() : _I_pos(_I_Buffer), _O_pos(_O_Buffer)
{
fread(_I_Buffer, 1, _I_Buffer_Size, stdin);
}
~IO_Tp()
{
fwrite(_O_Buffer, 1, _O_pos - _O_Buffer, stdout);
}
inline bool is_digit(const char ch)
{
return '0' <= ch && ch <= '9';
}
inline IO_Tp& operator>>(int& res)
{
res = 0;
while (!is_digit(*_I_pos))
++_I_pos;
do
(res *= 10) += (*_I_pos++) & 15;
while (is_digit(*_I_pos));
return *this;
}
inline IO_Tp& operator<<(int n)
{
static char _buf[10];
char* _pos(_buf);
do
*_pos++ = '0' + n % 10;
while (n /= 10);
while (_pos != _buf)
*_O_pos++ = *--_pos;
return *this;
}
inline IO_Tp& operator<<(char ch)
{
*_O_pos++ = ch;
return *this;
}
} IO;
inline int Max(register int a,register int b)
{
return a>b?a:b;
}
struct node
{
int l,r;
mutable bool v;
node(int L, int R=-1, bool V=0):l(L), r(R), v(V) {}
bool operator<(const node& o) const
{
return l < o.l;
}
};
set<node> s;
IT split(int pos)
{
IT it = s.lower_bound(node(pos));
if (it != s.end() && it->l == pos)
return it;
--it;
int L = it->l, R = it->r;
bool V = it->v;
s.erase(it);
s.insert(node(L, pos-1, V));
return s.insert(node(pos, R, V)).first;
}
void assign_val(int l,int r,bool v)
{
IT itr = split(r+1),itl = split(l);
s.erase(itl, itr);
s.insert(node(l, r, v));
}
void scure(int l,int r,int a,int b)
{
IT itr = split(r+1),itl = split(l),it = itl;
int sum=0;
for(; itl != itr; ++itl)
if(itl->v)
sum+=itl->r-itl->l+1;
s.erase(it,itr);
s.insert(node(l,r,0));
if(!sum)
return;
itr = split(b+1),itl = split(a),it = itl;
if(sum>=b-a+1)
{
s.erase(itl,itr);
s.insert(node(a,b,1));
return;
}
for( ; itl != itr; ++itl)
if(!itl->v)
{
sum-=itl->r-itl->l+1;
if(sum<0)
{
assign_val(itl->l,itl->r+sum,1);
break;
}
else
itl->v=1;
}
}
void sMax(int l,int r)
{
IT itr = split(r+1),itl = split(l);
int maxn=0,now=0;
for(; itl != itr; ++itl)
if(!itl->v)
now+=itl->r-itl->l+1;
else if(now)
maxn=Max(maxn,now),now=0;
IO<<Max(maxn,now)<<'\n';
}
int main()
{
int n,m;
IO>>n>>m;
s.insert(node(1,n,1));
while(m--)
{
int op,l,r;
IO>>op>>l>>r;
if(op==0)
assign_val(l,r,0);
else if(op==1)
{
int a,b;
IO>>a>>b;
scure(l,r,a,b);
}
else
sMax(l,r);
}
return 0;
}

【题解】Luogu P4344 [SHOI2015]脑洞治疗仪的更多相关文章

  1. 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)

    传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...

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

    题意简述 维护序列,支持以下操作: 0 l r:将l~r赋为0 1 l1 r1 l2 r2:将l1~r1中的1替换l2~r2中的0,多余舍弃 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉 ...

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

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

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

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

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

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

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

    前言 这道题目呢,看上去很难,实际上我们可以用线段树解决这道题目. 正文 我们维护 sum.len.tag.lmax.rmax.ans. sum 就是这段区间非脑洞的个数 len 就是这段区间的长度 ...

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

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

  8. 【[SHOI2015]脑洞治疗仪】

    我太sb啦 合并的时候又漏了,又漏了,又漏了 我个sb 这是个板子题,并不知道为什么SHOI2015会考这么板子的题,但是我又sb了,又sb了,又sb了,又没有1A 显然我是凉了 这道题有三个操作 区 ...

  9. bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解 ...

随机推荐

  1. JAVA比较两个List集合的方法

    import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.H ...

  2. 【转】JsonPath教程

    https://blog.csdn.net/koflance/article/details/63262484 1. 介绍 类似于XPath在xml文档中的定位,JsonPath表达式通常是用来路径检 ...

  3. MySQL 的三个浮点类型

    MySQL 支持的三个浮点类型是 FLOAT.DOUBLE 和 DECIMAL 类型. FLOAT 数值类型用于表示单精度浮点数值, DOUBLE 数值类型用于表示双精度浮点数值. 与整数一样,这些类 ...

  4. fullpage插件在移动端弹出键盘页面特殊处理

    fullpage插件大家都很熟悉 jquery一款全屏上下滑动的插件. 最近做公司一个活动移动端使用fullpage插件填写input的时候遇见一个问题,手机自带的键盘弹出的时候会把页面顶出去,页面错 ...

  5. CMake使用总结(转的)+自己的实践心得

    来自https://www.mawenbao.com/note/cmake.html 总结CMake的常用命令,并介绍有用的CMake资源. CMake意为cross-platform make,可用 ...

  6. 47.HTML---frame,iframe,frameset之间的关系与区别

    iframe 是在html页面内嵌入框架 框架内可以连接另一个页面, 如 <html> <head></head> <body> <iframe ...

  7. java微信小程序调用支付接口(转)

    简介:微信小程序支付这里的坑还是有的,所以提醒各位在编写的一定要注意!!! 1.首先呢,你需要准备openid,appid,还有申请微信支付后要设置一个32位的密钥,需要先生成一个sign,得到pre ...

  8. 在webpack自定义配置antd的按需加载和修改主题色

    最近使用antd来做react项目的UI.从antd官网上,在使用create-react-app脚手架搭建项目时步骤如下: (1)添加模块 react-app-rewired, babel-plug ...

  9. JavaScript数组去重方法总结

    一.双重遍历去重 function onlyFigure(arr) { let newarr = []; const length = arr.length for (let i = 0; i < ...

  10. sql语句,加引号和不加引号的区别

    今天碰到个问题,查询数据的时候,显示表不存在,在可视化窗口确实能看见.试着给表名加个引号,发现能成功查询数据了.上网查询原因如下: 1.oracle表和字段是有大小写的区别.oracle默认是大写,如 ...