题目传送门
线段树区间合并
一个区间存该区间最长的连续正面朝上的硬币情况和最长的连续反面朝上的硬币情况,如果这个区间全部翻转,交换该区间的这两种情况即可,其他的细节处理就是线段树的区间合并了,延迟标记不要丢掉了
具体看代码吧,感觉写的有点乱,也不想改了

#include<bits/stdc++.h>
using namespace std;#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define ls rt<<1
#define rs rt<<1|1
const int maxn=100000+100;
const int INF=0x3f3f3f3f;struct Tree{int lm,mm,rm;int Lm,Mm,Rm;int s;int S;int l,r;int lv,rv;int add;
}tree[maxn<<2];
int ans[maxn];inline Tree merge(Tree l,Tree r){Tree fa;fa.mm=max(l.mm,r.mm);fa.Mm=max(l.Mm,r.Mm);fa.lm=l.lm;fa.rm=r.rm;fa.Lm=l.Lm;fa.Rm=r.Rm;fa.l=l.l;fa.r=r.r;fa.lv=l.lv;fa.rv=r.rv;fa.s=fa.S=-INF;if(l.rv && r.lv){fa.mm=max(fa.mm,l.rm+r.lm);fa.lm=max(fa.lm,l.s+r.lm);fa.rm=max(fa.rm,l.rm+r.s);fa.s=max(fa.s,l.s+r.s);}if(!l.rv && !r.lv){fa.Mm=max(fa.Mm,l.Rm+r.Lm);fa.Lm=max(fa.Lm,l.S+r.Lm);fa.Rm=max(fa.Rm,l.Rm+r.S);fa.S=max(fa.S,l.S+r.S);}return fa;
}void build(int rt,int l,int r){if(l==r){tree[rt].mm=tree[rt].lm=tree[rt].rm=tree[rt].s=ans[l];tree[rt].Mm=tree[rt].Lm=tree[rt].Rm=tree[rt].S=(!ans[l]);tree[rt].l=l;tree[rt].r=r;tree[rt].add=0;tree[rt].lv=ans[l];tree[rt].rv=ans[r];return ;}int mid=(l+r)>>1;build(lson);build(rson);tree[rt]=merge(tree[ls],tree[rs]);tree[rt].add=0;
}inline void updateup(int rt){tree[ls].add++;tree[ls].add%=2;tree[rs].add++;tree[rs].add%=2;tree[ls].lv++;tree[ls].lv%=2;tree[ls].rv++;tree[ls].rv%=2;tree[rs].lv++;tree[rs].lv%=2;tree[rs].rv++;tree[rs].rv%=2;swap(tree[ls].lm,tree[ls].Lm);swap(tree[ls].rm,tree[ls].Rm);swap(tree[ls].mm,tree[ls].Mm);swap(tree[ls].s,tree[ls].S);swap(tree[rs].lm,tree[rs].Lm);swap(tree[rs].rm,tree[rs].Rm);swap(tree[rs].mm,tree[rs].Mm);swap(tree[rs].s,tree[rs].S);tree[rt].add=0;
}inline void update(int rt,int l,int r,int L,int R){if(L>r || R<l) return ;if(L<=l && R>=r){tree[rt].add++;tree[rt].add%=2;tree[rt].lv++;tree[rt].lv%=2;tree[rt].rv++;tree[rt].rv%=2;swap(tree[rt].lm,tree[rt].Lm);swap(tree[rt].rm,tree[rt].Rm);swap(tree[rt].mm,tree[rt].Mm);swap(tree[rt].s,tree[rt].S);return ;}if(tree[rt].add) updateup(rt);int mid=(l+r)>>1;update(lson,L,R);update(rson,L,R);int tmp=tree[rt].add;tree[rt]=merge(tree[ls],tree[rs]);tree[rt].add=tmp;
}inline Tree query(int rt,int l,int r,int L,int R){if(L<=l && R>=r) return tree[rt];if(tree[rt].add) updateup(rt);int mid=(l+r)>>1;if(R<=mid) return query(lson,L,R);else if(L>mid) return query(rson,L,R);else return merge(query(lson,L,R),query(rson,L,R));
}int main(){int n;while(scanf("%d",&n)==1){for(int i=1;i<=n;i++) scanf("%d",&ans[i]);build(1,1,n);int m;scanf("%d",&m);while(m--){int type,l,r;scanf("%d%d%d",&type,&l,&r);if(type) update(1,1,n,l,r);else printf("%d\n",query(1,1,n,l,r).mm);}}
}

计蒜客 - 硬币翻转相关推荐

  1. 计蒜客 17115 2017 ICPC 西安网络赛 B Coin

    Problem nanti.jisuanke.com/t/17115 Reference 关于二项展开式系数和 [二项式定理][推导]计蒜客17115 2017 ACM-ICPC 亚洲区(西安赛区)网 ...

  2. 计蒜客 挑战难题 爬楼梯

    计蒜客 挑战难题 爬楼梯 假设你现在正在爬楼梯,楼梯有n级.每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部? 格式: 第一行输入一个数n(n<=50),代表楼梯的级数. 接下来一行输 ...

  3. 无脑博士的试管们java_计蒜客 无脑博士和他的试管们

    标签: 无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直 ...

  4. 最短路(遍历边)计蒜客—DD坐地铁

    题目: C 城有 n 个站点, m 条双向地铁,每条地铁有一个 companyicompany_icompanyi​表示它的公司,如果连续乘坐同一家公司的地铁只要花 1元钱就好.DD现在想出门找萨摩耶 ...

  5. K - Triangle 计蒜客 - 42405

    K - Triangle 计蒜客 - 42405 题意: 给你一个三角形的三点,再给你三角形边上一个点,让你求另一个点(也要在三角形上),使得平分三角形的面积 题解: 计算几何 三角形的三边ab,ac ...

  6. H - Prince and Princess 计蒜客 - 42402

    H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主,有三种人,第一种是说真话的人(至少为1,因为公主是说真话的人),第二种人是只会说假话的,第三种是胡说八 ...

  7. C - Digital Path 计蒜客 - 42397 05-29

    C - Digital Path 计蒜客 - 42397 题意: 题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走,而且下一个位置必须比当前位置的数字大1,入口和出口必须数边缘元素, ...

  8. 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...

    在人才招聘领域存在这样一个怪圈,高校每年都说是最难就业年.人才过剩,而对于企业HR来说永远都招不到称心如意的人才.这个怪圈在"计蒜客"创始人俞昊然看来,主要是因为当今高校的教学资源 ...

  9. 计蒜客 - T1012 A*B问题

    计蒜客 - T1012 A*B问题 相信你已经学会 A+B 问题了,那么问题又来了- 输入两个正整数 A 和 B ,求 A×B. 输入格式 一行,包含两个正整数 A 和 B,中间用单个空格隔开. 1≤ ...

最新文章

  1. 我做的4周岁儿童编程课程【视频】分享
  2. 2018,人工智能在清算中落地
  3. DL之LiRDNNCNN:利用LiR、DNN、CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测
  4. nginx配置---upstream
  5. 崩坏3服务器维护多久,崩坏35月28日停服维护多久?4.0版本更新内容汇总[图]
  6. java jmstemplate_Java JmsTemplate.setReceiveTimeout方法代码示例
  7. Reddit大热,伯克利PPT带你丝滑入门机器学习:知识点全面覆盖,笔记可搭配食用...
  8. 1、CSS 盒子模型,2、边框样式,3、CSS 轮廓(outline),
  9. Android框架揭秘-JAVA服务框架
  10. 语音计算机怎么切换音乐模式,怎么实现一个设备播放一个程序的声音呢?
  11. 如何使用PDF阅读器将PDF转换成图片
  12. Kbps、KBps是什么意思?网络下载速度单位换算
  13. matlab频谱分析中振幅的物理意义,频谱图分析的意义,频谱图的物理意义是什么呢,频率的振幅能够反映什么物理意义呢?(例如下图)请哪位大师指点,不胜感激!...
  14. go学习笔记-语言指针
  15. php手册下载打开没有内容,word保存了但是再打开就没有了怎么办
  16. 从线代角度图解:通解、特解、非齐次通解、非齐次特解、齐次通解、齐次特解
  17. 用Comparator接口进行排序 --java
  18. 将ipad发挥到极致
  19. hackbar2.1.3 安装教程(附下载地址 )Firefox Chrome
  20. layui中的treeGrid 树形表格

热门文章

  1. 】20款优秀的移动产品原型和线框图设计工具
  2. 全球与中国用于食品饮料工艺的隔膜阀市场现状及未来发展趋势
  3. c 语言 int 转字符串,C++ 字符串string和整数int的互相转化操作
  4. Unity模糊远处物体,近处清晰,景深效果
  5. 终于好了,自动生成支付宝自定义收款码
  6. 【程序员的财富自由之路】停更说明...
  7. 中小项目敏捷实践之一(关于项目所有者和责任人)
  8. 扬州旅游app(五)
  9. 使用wxauto出现ImportError: DLL load failed while importing win32gui: 找不到指定的程序报错的解决方案
  10. 汇总现阶段reid方面一些SOTA的paper。