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. FFT \ NTT总结(多项式的构造方法)

    前言.FFT  NTT 算法 网上有很多,这里不再赘述. 模板见我的代码库: FFT:戳我 NTT:戳我 正经向:FFT题目解题思路 \(FFT\)这个玩意不可能直接裸考的..... 其实一般\(FF ...

  2. Luogu4149:[IOI2011]Race

    题目 bzoj权限题... Luogu Sol 点分治辣,边权非负,k>=1,开个\(1e6\)的桶就好辣 # include <bits/stdc++.h> # define RG ...

  3. centos7下搭建 MongoDB -01

    距离上次写的一篇mongoDB搭建已经有一年多的时间了,刚好这次在公司搭建好在centos7下的mongodb搭建,简单的做一个记录吧 mongo 是一个基于分布式文件存储的数据库,数据主要存储在磁盘 ...

  4. office 2013补丁包更新

    总是有客户发现使用office 2013 下的插件有问题,这个问题出现在低版本上,所以要给office 2013打上补丁,打上后,运行插件ok,出现的bug解决掉了.那么给office打补丁包就成了解 ...

  5. Java高并发秒杀系统【观后总结】

    项目简介 在慕课网上发现了一个JavaWeb项目,内容讲的是高并发秒杀,觉得挺有意思的,就进去学习了一番. 记录在该项目中学到了什么玩意.. 该项目源码对应的gitHub地址(由观看其视频的人编写,并 ...

  6. DaTaX当成jar包当作第三方库启动的相关问题

    上一篇已经大致的将了本地状况下DaTaX的纯Java代码启动的过程 http://www.cnblogs.com/blogsofmy/p/8287637.html不了解的请点超链接 这次我们来说说文件 ...

  7. .net core 2使用ef core 2.0以db first方法创建实体类

    先安装以下三个包: Install-Package Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityFr ...

  8. Spark2.1.0官方文档

    Spark 概述 Apache Spark是一个快速和通用的集群计算系统.它提供Java,scala,Python.R语言的APIs,以及支持一般执行图形的优化引擎. 它还支持一组丰富的高级工具,包括 ...

  9. 关于slmgr命令

    需要管理员的权限运行.这个命令可以用来卸载系统的序列号.使系统处于未激活状态.

  10. 如何在eclipse中添加ADT

    工具: Eclipse:官网下载地址:http://www.eclipse.org/downloads/下载SE或者EE版本的都可以 ADT:因为涉及到FQ问题,所以这里我给出一个参考网址:http: ...