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. [NOIP2017] 逛公园

    [NOIP2017] 逛公园 题目大意: 给定一张图,询问长度 不超过1到n的最短路长度加k 的1到n的路径 有多少条. 数据范围: 点数\(n \le 10^5\) ,边数\(m \le 2*10^ ...

  2. 【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)

    [BZOJ1911][APIO2010]特别行动队 题面 Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号, 要将他们拆分成若干特别行动队调入战场.出于默契的考 ...

  3. 【BZOJ3172】单词(AC自动机)

    [BZOJ3172]单词(AC自动机) 题面 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...

  4. Spring Boot初探之log4j2配置

    一.背景 下面讲在使用Spring Boot搭建微服务框架时如何配置log4j2,通过log4j2输出系统中日志信息. 二.添加log4j2的配置文件 在项目的src/main/rescources目 ...

  5. fitnesse - 安装部署

    fitnesse - 安装部署 2017-09-29 1 先决条件Java环境 确保机器上装了java, java -version 2 安装fitnesse http://fitnesse.org/ ...

  6. Handsontable添加超链接

    本文在上文的基础上,返回的数据中多了一个link超链接跳转的字段,,需要在Handsontable中显示超链接. <!DOCTYPE html> <html> <head ...

  7. C# Redis实战(七)

    七.修改数据 在上一篇 C# Redis实战(六)中介绍了如何查询Redis中数据,本篇将介绍如何修改Redis中相关数据.大家都知道Redis是key-value型存储系统,所以应该可以修改key, ...

  8. ajax提交表单、ajax实现文件上传

    ajax提交表单.ajax实现文件上传,有需要的朋友可以参考下. 方式一:利用from表单的targer属性 + 隐藏的iframe 达到类似效果, 支持提交含有文件和普通数据的复杂表单 方式二:使用 ...

  9. WordPress设置圆形旋转头像的方法

    很多网站的评论者的头像都是圆形的,并且当你的鼠标移上去的时候会旋转,那么这个怎么实现呢,我在网上找了很多,但是和我的主题都不适用,现在把我修改后的代码贴出来,只要将下面的代码添加到style.css中 ...

  10. Python3 多线程编程(thread、threading模块)

    threading是对thread的封装. 1.开启线程: t=threading.Thread(target=sayhi,args=('hh',)) t.start() 或者先建一个Thread的继 ...