题意:给一行棋子(只有黑色和白色,1为黑,0为白),长度为100000。有m个操作,x,l,r  若x==0,查询(l,r)区间内连续的黑棋最大数量,若x==1,翻转(l,r)区间。

#include <iostream>
#include<stdio.h>
using namespace std;
#define maxn 500001
int n,m,a[maxn];
int max(int x,int y,int z)
{return max(max(x,y),z);
}
void swap(int *ji1,int *ji2)
{int t;t=*ji1;*ji1=*ji2;*ji2=t;
}
struct node
{int l,r,ll1,rr1,m1,ll0,rr0,m0,c;
}tr[maxn*4];
void pushup(int id)
{int len1,len2;len1=tr[id*2].r-tr[id*2].l+1;len2=tr[id*2+1].r-tr[id*2+1].l+1;tr[id].ll1=tr[id*2].ll1;tr[id].rr1=tr[id*2+1].rr1;if(tr[id*2].ll1==len1)tr[id].ll1+=tr[id*2+1].ll1;if(tr[id*2+1].rr1==len2)tr[id].rr1+=tr[id*2].rr1;tr[id].m1=max(tr[id*2].m1,tr[id*2+1].m1,tr[id*2].rr1+tr[id*2+1].ll1);//在id节点 只考虑ll1,rr1但是有可能中间段是最大的tr[id].ll0=tr[id*2].ll0;tr[id].rr0=tr[id*2+1].rr0;if(tr[id*2].ll0==len1)tr[id].ll0+=tr[id*2+1].ll0;if(tr[id*2+1].rr0==len2)tr[id].rr0+=tr[id*2].rr0;tr[id].m0=max(tr[id*2].m0,tr[id*2+1].m0,tr[id*2].rr0+tr[id*2+1].ll0);}
void bulid(int id,int l,int r)
{tr[id].l=l;tr[id].r=r;tr[id].c=0;if(l==r){tr[id].ll1=tr[id].m1=tr[id].rr1=a[l]?1:0;tr[id].ll0=tr[id].m0=tr[id].rr0=a[l]?0:1;}else{int mid=(l+r)/2;bulid(id*2,l,mid);bulid(id*2+1,mid+1,r);pushup(id);}
}
void exchang(int id)
{if(tr[id].c==1)tr[id].c=0;else tr[id].c=1;//此处注意,重复更新同样的区间,则相当于没更新swap(tr[id].ll0,tr[id].ll1);swap(tr[id].rr0,tr[id].rr1);swap(tr[id].m0,tr[id].m1);
}
void pushdown(int id)
{exchang(id*2);exchang(id*2+1);tr[id].c=0;
}
int query(int id,int l,int r)
{if(l<=tr[id].l&&tr[id].r<=r){return tr[id].m1;}else{if(tr[id].c!=0){pushdown(id);}int mid=(tr[id].r+tr[id].l)/2;if(r<=mid)return query(id*2,l,r);else if(l>mid)return query(id*2+1,l,r);//*************************//else{int l1=query(id*2,l,r);int r1=query(id*2+1,l,r);int a=tr[id*2].rr1;//左子树右边最长连续1,注意它的个数不应该大于区间[l,tr[rt<<1].r]的个数int b=tr[id*2+1].ll1;//右子树左边最长连续1,注意它的个数不应该大于区间[tr[rt<<1|1].l,r]的个数if(a>tr[id*2].r-l+1)a=tr[id*2].r-l+1;if(b>r-tr[id*2+1].l+1)b=r-tr[id*2+1].l+1;return  max(l1,r1,a+b);}//*************************//}
}
void update(int id,int l,int r)
{if(l<=tr[id].l&&tr[id].r<=r){exchang(id);//此处注意,重复更新同样的区间,则相当于没更新}else{if(tr[id].c!=0)pushdown(id);int mid=(tr[id].r+tr[id].l)/2;if(r<=mid)update(id*2,l,r);else if(l>mid)update(id*2+1,l,r);else{update(id*2,l,r);update(id*2+1,l,r);}pushup(id);}
}
int main()
{int i,l,r,t;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++)scanf("%d",&a[i]);bulid(1,1,n);scanf("%d",&m);while(m--){scanf("%d%d%d",&t,&l,&r);if(t==0){printf("%d\n",query(1,l,r));}else{update(1,l,r);}}}return 0;
}

HDU3911 Black And White(黑白子)相关推荐

  1. hdu3911 Black And White (线段树/区间合并)

    题目 n(n<=1e5)个数的数列,每个数只可能是0或1 m(m<=1e5)个操作,操作分两种 1 x y 代表 将[x,y]内所有数都取反 0 x y 询问 [x,y]内最长连续1的个数 ...

  2. 通用逼近定理_用代码理解通用逼近定理

    通用逼近定理 The Universal approximation theorem claims that the standard multi-layer feedforward networks ...

  3. CORBA 架构体系指南(通用对象请求代理体系架构)

    什么是 CORBA 架构? 概述 通用对象请求代理体系架构 (CORBA) 是由对象管理组 (OMG) 定义的标准,它使以多种计算机语言编写并在多台计算机上运行的软件组件能够协同工作. CORBA 是 ...

  4. 日本风俗业数据_神奇宝贝如何融入日本民俗

    日本风俗业数据 Life in a post-modern society consists of moving in anonymous spaces where there is a yearni ...

  5. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务等等

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  6. 网页游戏五子棋php,HTML5网页版黑白子五子棋游戏的示例代码分享

    闲来无事做,用H5搞了几个小游戏,当然本人只是菜鸟,搞出来玩玩,大神莫喷哦, 1.HTML5网页版黑白子五子棋游戏代码,源码请下载附件! 部分前端代码: 五子棋 *{ margin:0; paddin ...

  7. 用OpenCV编程计算围棋棋盘黑白子总数

        今天柯洁开始对战AlphaGo,虽然对围棋一窍不通,但这种大事我也在关注,知道胜负与最后棋盘上黑白子的数量有关.当我看到结局的棋盘时,黑白棋子那么多,一时也看不出来谁多谁少,就想着编个程序来计 ...

  8. 五子棋游戏代码html,HTML5网页版黑白子五子棋游戏代码

    特效描述:HTML5 网页版黑白子五子棋 五子棋游戏. 通过原生js和canvas实现五子棋,可以试下左右手互搏 代码结构 1. HTML代码 PK 您的浏览器不支持canvas var text = ...

  9. PV操作 黑白子问题 C#

    多线程处理 问题描述 问题分析 代码实现 问题描述 黑白子分拣问题:有2个线程,一个专拣黑子,另一个专拣白子,每次只能拣一子. 用C#的同步和互斥机制实现,2个白子.1个黑子交替的分拣方案. 问题分析 ...

最新文章

  1. MSSQL SELECT(刚刚)新插入到表中的那条记录
  2. PowerPoint发布及链接图片的处理
  3. 使用Gson对复杂json对象的成员进行删选
  4. html action get post请求参数乱码,input type=text 发送请求参数,中文乱码问题
  5. C语言 指针数组 - C语言零基础入门教程
  6. 重定向无法设置页面编码?
  7. Don't Panic! KRACK 没你想象的那么糟
  8. 安装HDFS过程中Browse Directory报错
  9. 浅谈聚类分析MATLAB实现
  10. oracle中imp命令详解
  11. windows之打开文件夹、控制面板显示服务器运行失败
  12. Civil 3d中的mms文件
  13. Simulink常用模块库(Delay)
  14. Ubuntu 18.04 安装 deepin 微信
  15. 【英语:语法基础】C4.日常对话-餐饮专题
  16. NC344 Z字形输出字符串
  17. Python 1. 如何选择python版本,以及如何选择开发环境(IDE)
  18. 谷粒商城 -->「P01-P44」
  19. 用单流802.11n实现的VoWiFi
  20. GCC 命令行详解 -L -l

热门文章

  1. 计算机简介Python简介关键字和标识符输入输出
  2. python 截屏 自动发送邮件 实现远程监控屏幕
  3. Unity 之 UGUI Layout自动布局组件详解
  4. 对于CRITICAL_SECTION用法的介绍和理解
  5. iOS开发之网银在线支付快捷支付商户接口规范
  6. 全球第一经典语录,被500万人疯狂转载!
  7. jQuery实现textarea高度自适应
  8. 【OpenAI】MADDPG算法与Multiagent-Envs环境项目总结
  9. 从杨致远辞去雅虎说起,那些衰落的网站巨头给我们的启示
  10. Nginx配置referer校验,实现简单的防盗链