点此看题面

大致题意: 给你一个\(01\)序列,让你支持区间赋值、区间取反、区间求和以及求一段区间内最多有多少连续的\(1\)这些操作。

\(ODT\)

这道题正解似乎是线段树,但码量较大,而且细节也很多。

而用\(ODT\)来做这道题就非常简单了。

区间赋值

就相当于\(ODT\)的\(Assign\)操作。

区间取反

暴力扫一遍,将每个点的值异或\(1\)即可。

区间求和

暴力扫一遍,统计每个点的长度乘以权值的和即可。

求一段区间内最多有多少连续的\(1\)

暴力扫一遍,统计有多少个连续的\(1\),然后更新\(res\)求\(max\)即可。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n,a[N+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c))
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
I void clear() {fwrite(FO,1,C,stdout),C=0;}
}F;
class ODT//ODT模板
{
private:
#define IT set<Il>::iterator
#define ins insert
#define era erase
#define fir first
#define LB lower_bound
#define len(t) ((t)->r-(t)->l+1)
struct Il//记录区间信息
{
int l,r;mutable int v;I Il(CI x=0,CI y=0,CI p=0):l(x),r(y),v(p){}
I bool operator < (Con Il& t) Con {return l<t.l;}
};set<Il> S;
I IT Sp(CI x)//分裂操作
{
IT t;if((t=S.LB(Il(x)))!=S.end()&&!(t->l^x)) return t;
--t;RI l=t->l,r=t->r,v=t->v;return S.era(t),S.ins(Il(l,x-1,v)),S.ins(Il(x,r,v)).fir;
}
public:
I void Init(CI x,int* s) {for(RI i=(s[0]=s[x+1]=-1,1),t=0;i<=x+2;++i) s[i]^s[i-1]&&(S.ins(Il(t,i-1,s[i-1])),t=i);}//初始化
I void Assign(CI x,CI y,CI v) {IT tr=Sp(y+1),tl=Sp(x);S.era(tl,tr),S.ins(Il(x,y,v));}//推平操作
I void Inverse(CI x,CI y) {IT tr=Sp(y+1),tl=Sp(x),t=tl;W(t!=tr) (t++)->v^=1;}//区间取反
I int QSum(CI x,CI y) {IT tr=Sp(y+1),tl=Sp(x);RI t=0;W(tl!=tr) t+=tl->v*len(tl),++tl;return t;}//区间求和
I int QCon(CI x,CI y) {IT tr=Sp(y+1),tl=Sp(x);RI t=0,p=0;W(tl!=tr) tl->v?p+=len(tl),Gmax(t,p):p=0,++tl;return t;}//求一段区间内最多有多少连续的1
}O;
int main()
{
RI Qtot,i,op,x,y;for(F.read(n,Qtot),i=1;i<=n;++i) F.read(a[i]);
O.Init(n,a);W(Qtot--)
{
switch(F.read(op,x,y),++x,++y,op)
{
case 0:O.Assign(x,y,0);break;case 1:O.Assign(x,y,1);break;
case 2:O.Inverse(x,y);break;case 3:F.writeln(O.QSum(x,y));break;
case 4:F.writeln(O.QCon(x,y));break;
}
}return F.clear(),0;
}

【BZOJ1858】[SCOI2010] 序列操作(ODT裸题)的更多相关文章

  1. BZOJ1858 [Scoi2010]序列操作(线段树)

    题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...

  2. bzoj1858[Scoi2010]序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3079  Solved: 1475[Submit][Statu ...

  3. 洛谷P2572 [SCOI2010]序列操作(ODT)

    题解 题意 题目链接 Sol ODT板子题..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long l ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. BZOJ1858[Scoi2010]序列操作 题解

    题目大意: 有一个01序列,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0:1 a b 把[a, b]区间内的所有数全变成1:2 a b 把[a,b]区间 ...

  6. 【分块】bzoj1858 [Scoi2010]序列操作

    分块 Or 线段树 分块的登峰造极之题 每块维护8个值: 包括左端点在内的最长1段: 包括右端点在内的最长1段: 该块内的最长1段: 该块内1的个数: 包括左端点在内的最长0段://这四个是因为可能有 ...

  7. [BZOJ1858] [SCOI2010] 序列操作 解题报告 (线段树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 Description lxhgww最近收到了一个01序列,序列里面包含了n个数, ...

  8. bzoj1858: [Scoi2010]序列操作

    lazy-tag线段树. #include<cstdio> #include<algorithm> #include<cstring> using namespac ...

  9. [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655

    待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写

  10. bzoj1858 [Scoi2010]序列操作——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 线段树...调了一个上午...(后面带 // 的都是改出来的) lazy 标记的下放好 ...

随机推荐

  1. jinkens 检查svn更新就构建

    以下的配置就是,svn上的文件一旦有变动,一分钟后就会触发jinkens的job(构建)

  2. 5-----Scrapy框架中Spiders用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 1.以初始的URL初始化Request, ...

  3. json处理第一篇:利用Jackson处理json

    利用Jackson处理json需要导入的jar包(2以上版本的): <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.c ...

  4. 2019.03.21 读书笔记 枚举ENUM

    其实没必要为枚举显式赋值,如果赋值了,就一定要全部赋值,否则默认在上一个元素的基础上+1,如果不给枚举变量赋值,就算枚举中没有0元素,也会显示为0,而超出枚举范围的整型数据,也会显示值本身,而不是异常 ...

  5. inventor删除不干净

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  6. 性能测试工具LoadRunner10-LR之Virtual User Generator 错误处理函数

    VuGen提供了错误处理函数lr_continue_on_error,用来在脚本中实时修改Vuser的出错设置.lr_continue_on_error函数语法结构如下: void lr_contin ...

  7. eclipse中使用git下载项目

    准备工作: 目的:从远程仓库github上down所需的项目 eclipse使用git插件下载github上项目 eclipse版本:eclipse4.5  64位 jdk版本:jdk-1.7 64位 ...

  8. JavaScript控制流及关键字与C语言之比较

    学习JavaScript控制流及关键字概念前,对有过C语言学习经验的同学来说,那么关键字,控制语句概念并不陌生.我们先来看看C语言吧: C语言的32个关键字和9种控制语句 9种控制语句: if.if- ...

  9. 关于微信小程序登录授权

    小程序的API接口文档写的很清晰,现在理一遍思路. 前端通过wx.login()获取code ,把code发给后台,后台返回openid,再获取用户的授权信息(这里先判断是否授权,授权过的就直接进入小 ...

  10. c#操作excel的一些记录

    //开启Excel APP            Excel.Application xlApp = new Excel.Application(); //获取程序下bin—>debug下的文件 ...