bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
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]序列操作的更多相关文章
- BZOJ1858 [Scoi2010]序列操作(线段树)
题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...
- bzoj1858[Scoi2010]序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 3079 Solved: 1475[Submit][Statu ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划299:bzoj1856: [Scoi2010]字符串
http://www.lydsy.com/JudgeOnline/problem.php?id=1856 卡特兰数 从(1,1)走到(n,m),不能走y=x 上方的点,求方案数 从(1,1)走到(n, ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏
http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...
- bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...
随机推荐
- [BZOJ1041] [HAOI2008] 圆上的整点 (数学)
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...
- [BZOJ1024] [SCOI2009] 生日快乐 (搜索)
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...
- token的时限多长才合适?
在使用JWT时,一个让人纠结的问题就是"Token的时限多长才合适?".对此,Stormpath的这篇文章给出了一个可供参考的建议: 面对极度敏感的信息,如钱或银行数据,那就根本不 ...
- java --基本数据类型间的转换
public class changetype { public static void main(String[] args) { String ar = "true"; //S ...
- 基于python创建一个简单的HTTP-WEB服务器
背景 大多数情况下主机资源只有开发和测试相关人员可以登录直接操作,且有些特定情况"答辩.演示.远程"等这些场景下是无法直接登录主机的.web是所有终端用户都可以访问了,解决了人员权 ...
- SDN 网络系统之 Mininet 与 API 详解
SDN 网络系统之 Mininet 与 API 详解 Mininet 是轻量级的软件定义网络系统平台,同时提供了对 OpenFlow 协议的支持.本文主要介绍了 Mininet 的相关概念与特性,并列 ...
- 关于现在IT行业从业者一些建议
本人从事IT行业,确切的说应该是软件开发行业已经9个年头了,从刚开始小白也慢慢的已经有了自己独有的开发习惯. 近些年进入行业的人越来越多,有可能确实看到了这行业就业及薪资待遇,更多的也是随着互联网及移 ...
- pycharm+selenium搭建环境之no module named 'selenium'异常解决
在pycharm上搭建python+selenium自动化测试环境时,遇到一个很坑的问题:no moduel named 'selenium' 如下图: 解决方法: 1.查看你的python是否正确安 ...
- Xshell提示缺失mfc110.dll
xshell 应用程序无法正常启动0xc000007b 下载 DirectX修复工具_3.3 Xshell 缺少 mfc110.dll https://www.microsoft.co ...
- HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0区别
HTTP协议 :Hyper Text Transfer Protocol(超文本传输协议),是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议.是互联网上应用 ...