浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3911

用线段树维护六个信息,分别是区间最长子段,最左边连续的最长段,最右边连续的最长段,然后分\(0\),\(1\)分别处理出来。询问的时候因为会先访问最左边的段,然后依次往右走,所以开一个全局变量存上一段最右一段\(1\)有多长,然后和当前段合并起来更新答案就行。

时间复杂度:\(O(mlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=1e5+5; int a[maxn];
int n,m,ans,mx; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct tree_node {
int mx[2],lft[2],rgt[2];
}; struct segment_tree {
bool rev[maxn<<2];
tree_node tree[maxn<<2]; void updata(int p,int l,int r) {
int mid=(l+r)>>1;
for(int i=0;i<2;i++) {
tree[p].mx[i]=max(tree[p<<1].rgt[i]+tree[p<<1|1].lft[i],max(tree[p<<1].mx[i],tree[p<<1|1].mx[i]));
if(tree[p<<1].lft[i]==mid-l+1)tree[p].lft[i]=tree[p<<1].lft[i]+tree[p<<1|1].lft[i];
else tree[p].lft[i]=tree[p<<1].lft[i];
if(tree[p<<1|1].rgt[i]==r-mid)tree[p].rgt[i]=tree[p<<1].rgt[i]+tree[p<<1|1].rgt[i];
else tree[p].rgt[i]=tree[p<<1|1].rgt[i];
}
} void add_tag(int p) {
rev[p]^=1;
swap(tree[p].mx[0],tree[p].mx[1]);
swap(tree[p].lft[0],tree[p].lft[1]);
swap(tree[p].rgt[0],tree[p].rgt[1]);
} void push_down(int p) {
if(rev[p]) {
add_tag(p<<1);
add_tag(p<<1|1);
rev[p]=0;
}
} void build(int p,int l,int r) {
rev[p]=0;
for(int i=0;i<2;i++)
tree[p].mx[i]=tree[p].lft[i]=tree[p].rgt[i]=0;//多组数据要记得清空
if(l==r) {
tree[p].mx[a[l]]=1;
tree[p].lft[a[l]]=1;
tree[p].rgt[a[l]]=1;
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
updata(p,l,r);
} void rever(int p,int l,int r,int L,int R) {
if(L<=l&&r<=R) {
add_tag(p);
return;
}
int mid=(l+r)>>1;push_down(p);
if(L<=mid)rever(p<<1,l,mid,L,R);
if(R>mid)rever(p<<1|1,mid+1,r,L,R);
updata(p,l,r);
} void query(int p,int l,int r,int L,int R) {
if(L<=l&&r<=R) {
ans+=tree[p].lft[1];
mx=max(mx,max(tree[p].mx[1],ans));
if(tree[p].lft[1]!=r-l+1)ans=tree[p].rgt[1];
return;
}
int mid=(l+r)>>1;push_down(p);
if(L<=mid)query(p<<1,l,mid,L,R);
if(R>mid)query(p<<1|1,mid+1,r,L,R);
}
}T; int main() {
while(~scanf("%d",&n)) {
for(int i=1;i<=n;i++)
a[i]=read();
T.build(1,1,n);m=read();
for(int i=1;i<=m;i++) {
int opt=read(),l=read(),r=read();
if(opt==1)T.rever(1,1,n,l,r);
else {
ans=mx=0;
T.query(1,1,n,l,r);
printf("%d\n",mx);
}
}
}
return 0;
}

HDU3991:Black and White的更多相关文章

  1. 项目搭建(二):NUnit&TestStack.White

    一.单元测试框架NUnit NUnit是所有.net语言的单元测试框架.使用C#语言编写. 测试框架:NUnit3 1. 安装NuGet包管理器 2. 在NuGet中安装NUnit.NUnit.Con ...

  2. AtCoder Grand Contest 014 D:Black and White Tree

    题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_d 题目翻译 给你一棵树,每次任选一个点染色,先手染白色,后手染黑色.如果最后存在一个白色的点 ...

  3. HDU 5113:Black And White(DFS)

    题目链接 题意 给出一个n*m的图,现在有k种颜色让你对这个图每个格子染色,每种颜色最多可以使用col[i]次,问是否存在一种染色方案使得相邻格子的颜色不同. 思路 以为是构造题,结果是爆搜.对于每一 ...

  4. 2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest E:Black or White

    这道题可以比较容易看出是线性DP.设dp[i]代表把前i个格子刷成目标状态的最小步数. 写出状态转移方程 dp[i]=min( dp[j]+calc(j+1,i) ) (i-j<=k) calc ...

  5. 前端利器:SASS基础与Compass入门

    SASS是Syntactically Awesome Stylesheete Sass的缩写,它是css的一个开发工具,提供了很多便利和简单的语法,让css看起来更像是一门语言,这种特性也被称为“cs ...

  6. Qt Style Sheet实践(一):按钮及关联菜单

    导读 正如web前端开发中CSS(Cascade Style Sheet)的作用一样,Qt开发中也可以使用修改版的QSS将逻辑业务和用户界面进行隔离.这样,美工设计人员和逻辑实现者可以各司其职而不受干 ...

  7. 用Qt写软件系列四:定制个性化系统托盘菜单

    导读 一款流行的软件,往往会在功能渐趋完善的时候,通过改善交互界面来提高用户体验.毕竟,就算再牛逼的产品,躲藏在糟糕的用户界面之后总会让用户心生不满.界面设计需综合考虑审美学.心理学.设计学等多因素, ...

  8. 实战Django:官方实例Part6

    我们终于迎来了官方实例的最后一个Part.在这一节中,舍得要向大家介绍Django的静态文件管理. 现在,我们要往这个投票应用里面添加一个CSS样式表和一张图片. 一个完整的网页文件,除了html文档 ...

  9. Android:安卓资源引用符号的含义

    @代表引用资源 @*代表引用系统的非public资源,如: @*android:color/white @[package:]type/name引用自定义资源,如: android:text=&quo ...

随机推荐

  1. C与C++在形參的一点小差别

    先看一下以下的代码: int fun(a,b) int a; int b; { return 10; } void main(int argc, char ** argv) { fun(10); re ...

  2. 源码维护基本命令diff_patch_quilt

    源码维护基本命令 一. diff--生成补丁 diff [命令行选项] 源文件 新文件 -r 递归处理相应目录 -N 包含新文件到patch -u 输出统一格式(unified format),这种格 ...

  3. 【转载】【selenium+Python WebDriver】之元素定位

    总结: 感谢: “煜妃”<Selenuim+Python之元素定位总结及实例说明> “Huilaojia123”<selenium WebDriver定位元素学习总结> “上海 ...

  4. visual studio 2010 c++ 打印 Hello world

    由于好奇心驱使温习下c高级简化语言语言(个人解释可能不太准确).下面用visual studio 2010 实现 HelloWord 打印 第一步:visual studio 2010 打开.文件-- ...

  5. MongoDB查询语句(转)

    目录 查询操作 集合查询方法 find() 查询内嵌文档 查询操作符(内含 数组查询) "$gt" ."$gte". "$lt". &quo ...

  6. Nodejs学习笔记 --- 调用命令方法ld_process.exec()和child_process.execFile()

    本文主要记录项目中使用NodeJS实现在线构建项目时,通过代码自动调用命令行. 参考资料&内容来源: Nodejs官网:http://nodejs.cn/api/child_process.h ...

  7. Python文件编码不可以使用UTF16

    1. The complete Python source file should use a single encoding. Embedding of differently encoded da ...

  8. Golang 环境变量及工作区概念

    GOROOT go的安装路径 GOPATH 可以有多个目录,每个目录就是一个工作区,放置源码文件,以及安装后的归档文件和可执行文件: 第一个工作区比较重要,go get会自动从一些主流公用代码仓库下载 ...

  9. Arcgis SOE学习

    http://blog.csdn.net/lovecarpenter/article/details/53178233 http://blog.csdn.net/lovecarpenter/artic ...

  10. Java for LeetCode 108 Convert Sorted Array to Binary Search Tree

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 解题 ...