http://www.lydsy.com/JudgeOnline/problem.php?id=1858

2018 自己写的第1题,一遍过

^_^

元旦快乐

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001 struct node
{
int siz;
int L[],R[],con[];
int sum[];
bool rev;
int cover;
}tr[N<<]; struct node_
{
int L1,R1,con1;
int siz;
}; node_ operator + (node_ l,node_ r)
{
node_ res;
res.L1=l.L1;
if(l.L1==l.siz) res.L1+=r.L1;
res.R1=r.R1;
if(r.R1==r.siz) res.R1+=l.R1;
res.con1=max(l.con1,r.con1);
res.con1=max(res.con1,l.R1+r.L1);
return res;
} int x; int ans; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void update(int k)
{
for(int i=;i<=;++i)
{
tr[k].L[i]=tr[k<<].L[i];
if(tr[k<<].L[i]==tr[k<<].siz) tr[k].L[i]+=tr[k<<|].L[i];
tr[k].R[i]=tr[k<<|].R[i];
if(tr[k<<|].R[i]==tr[k<<|].siz) tr[k].R[i]+=tr[k<<].R[i];
tr[k].con[i]=max(tr[k<<].con[i],tr[k<<|].con[i]);
tr[k].con[i]=max(tr[k].con[i],tr[k<<].R[i]+tr[k<<|].L[i]);
tr[k].sum[i]=tr[k<<].sum[i]+tr[k<<|].sum[i];
}
} void build(int k,int l,int r)
{
tr[k].cover=-;
tr[k].siz=r-l+;
if(l==r)
{
read(x);
tr[k].L[x]++;
tr[k].R[x]++;
tr[k].con[x]++;
tr[k].sum[x]++;
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
update(k);
} void reverse(int k)
{
swap(tr[k].L[],tr[k].L[]);
swap(tr[k].R[],tr[k].R[]);
swap(tr[k].con[],tr[k].con[]);
swap(tr[k].sum[],tr[k].sum[]);
tr[k].rev^=;
if(tr[k].cover!=-) tr[k].cover^=;
} void down_rev(int k)
{
reverse(k<<);
reverse(k<<|);
tr[k].rev^=;
} void covering(int k,int w)
{
tr[k].L[w]=tr[k].R[w]=tr[k].con[w]=tr[k].sum[w]=tr[k].siz;
tr[k].L[w^]=tr[k].R[w^]=tr[k].con[w^]=tr[k].sum[w^]=;
tr[k].cover=w;
tr[k].rev=false;
} void down_cov(int k)
{
covering(k<<,tr[k].cover);
covering(k<<|,tr[k].cover);
tr[k].cover=-;
} void Cover(int k,int l,int r,int opl,int opr,int w)
{
if(l>=opl && r<=opr)
{
covering(k,w);
return;
}
if(tr[k].rev) down_rev(k);
if(tr[k].cover!=-) down_cov(k);
int mid=l+r>>;
if(opl<=mid) Cover(k<<,l,mid,opl,opr,w);
if(opr>mid) Cover(k<<|,mid+,r,opl,opr,w);
update(k);
} void Reverse(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
reverse(k);
return;
}
if(tr[k].rev) down_rev(k);
if(tr[k].cover!=-) down_cov(k);
int mid=l+r>>;
if(opl<=mid) Reverse(k<<,l,mid,opl,opr);
if(opr>mid) Reverse(k<<|,mid+,r,opl,opr);
update(k);
} void query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
ans+=tr[k].sum[];
return;
}
if(tr[k].rev) down_rev(k);
if(tr[k].cover!=-) down_cov(k);
int mid=l+r>>;
if(opl<=mid) query(k<<,l,mid,opl,opr);
if(opr>mid) query(k<<|,mid+,r,opl,opr);
} node_ Query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
node_ res;
res.L1=tr[k].L[];
res.R1=tr[k].R[];
res.con1=tr[k].con[];
res.siz=tr[k].siz;
return res;
}
if(tr[k].rev) down_rev(k);
if(tr[k].cover!=-) down_cov(k);
int mid=l+r>>;
if(opr<=mid) return Query(k<<,l,mid,opl,opr);
if(opl>mid) return Query(k<<|,mid+,r,opl,opr);
return Query(k<<,l,mid,opl,opr)+Query(k<<|,mid+,r,opl,opr);
} int main()
{
int n,m;
read(n); read(m);
build(,,n);
int ty,l,r;
while(m--)
{
read(ty); read(l); read(r);
l++; r++;
switch(ty)
{
case : Cover(,,n,l,r,); break;
case : Cover(,,n,l,r,); break;
case : Reverse(,,n,l,r); break;
case : ans=; query(,,n,l,r); cout<<ans<<'\n'; break;
case : printf("%d\n",Query(,,n,l,r).con1); break;
}
}
}

bzoj千题计划177:bzoj1858: [Scoi2010]序列操作的更多相关文章

  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. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  4. bzoj千题计划299:bzoj1856: [Scoi2010]字符串

    http://www.lydsy.com/JudgeOnline/problem.php?id=1856 卡特兰数 从(1,1)走到(n,m),不能走y=x 上方的点,求方案数 从(1,1)走到(n, ...

  5. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  6. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

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

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

  8. bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...

  9. bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...

随机推荐

  1. ssm整合快速入门程序(一)

    整合基础说明 spring 是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Jav ...

  2. 【BZOJ3282】Tree (Link-Cut Tree)

    [BZOJ3282]Tree (Link-Cut Tree) 题面 BZOJ权限题呀,良心luogu上有 题解 Link-Cut Tree班子提 最近因为NOIP考炸了 学科也炸了 时间显然没有 以后 ...

  3. [Luogu3066][USACO12DEC]逃跑的BarnRunning Away From…

    题面 题目描述 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 输入格式: Line 1: 2 integers, N and L (1 <= N <= 2 ...

  4. django 下拉菜单显示为object的解决办法

    在创建完Django数据库结构之后,使用Django自带的强大的admin功能往数据库中添加数据,图形化界面如下: 但时候有下拉框选项(只要在model中有定义Charfield就会显示为下拉框),如 ...

  5. centos7.2 配置内网ntp服务器进行时间同步

    (一)修改/etc/ntp.conf 配置文件,注意红色部分,其他部分不需要改  ########################################################### ...

  6. Java 多线程之哪个对象才是锁?

    问题背景 在感觉正常的使用ArrayList的迭代删除的操作的时候,发现了如下的崩溃日志: Caused by: java.util.ConcurrentModificationException a ...

  7. 使用.NET Core快速开发一个较正规的命令行应用程序

    程序员的世界,命令行工具一直是"体验非常友好"的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本).在.NET Core中,命令行应用程序是基础,但 ...

  8. MySQL的bigint类型

    bigint支持的数字的大小范围为:19位,存电话号码.有符号范围:-9223372036854775808 到 9223372036854775807 int支持的数字范围为:10位,有符号范围:- ...

  9. PHP7变量的内部实现

    PHP7变量的内部实现 受篇幅限制,这篇文章将分为两个部分.本部分会讲解PHP5和PHP7在zval结构体的差异,同时也会讨论引用的实现.第二部分会深入探究一些数据类型如string和对象的实现. P ...

  10. Atlas安装配置

    准备环境 192.168.1.1(Altas) 192.168.1.2(MySQL主) 192.168.1.3(MySQL从) 官方链接:https://github.com/Qihoo360/Atl ...