记'1'为+1,'0'为-1;
可以发现

pre[i],suf[i]分别为前/后缀和

a[i]=max(pre[l.....i]);

b[i]=max(suf[i+1....r]);

ans=max(a[l]+b[l],a[l+1]+b[l+1],........a[r]+b[r]);

即ans=最大的不相交的(前缀和+后缀和)

证明:
首先下界是显然的,即不可能比这个答案更小。
至于上界, 可以大力分类讨论证明。

比如
假如存在一个后缀不合法
设ans=pre[l]+suf[r];
设这个不合法的后缀位置为k。
k>l时:
此时suf[r]显然可以在保证pre[l]不变的情况下找到一个更大的取值,矛盾。

k<l时:
此时有一个显然的结论是
t=sum[l+1..r-1]<=0
因为>0的话显然可以再保证pre[l]不变的情况下找到一个更大的suf[r]。
再设p=sum[k..l-1],p+t显然大于0
显然这时答案不会超过pre[l]-p+suf[r]+p+t=pre[l]+suf[r]+t
因为t<=0,不会更优

得证

最后,用线段树维护即可
每一个节点保存对应区间的区间和,最大前缀,最大后缀,答案

#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define N 220000
#define eps 1e-7
#define inf 1e9+7
#define ll long long
using namespace std;
inline int read()
{char ch=0;int x=0,flag=1;while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*flag;
}
struct tree
{int tot,pre,suf,ans;
}node[N*4];
tree operator+(tree a,tree b)
{tree ans;ans.tot=a.tot+b.tot;ans.pre=max(a.pre,b.pre+a.tot);ans.suf=max(b.suf,a.suf+b.tot);ans.ans=max(a.pre+b.suf,max(a.ans+b.tot,b.ans+a.tot));return ans;
}
char s[N];
struct Segment_Tree
{#define lson o<<1#define rson o<<1|1#define mid ((l+r)>>1) inline void pushup(int o){node[o]=node[lson]+node[rson];}void build(int o,int l,int r){if(l==r){if(s[l-1]=='1')node[o]=(tree){1,1,1,1};else node[o]=(tree){-1,0,0,0};return;}build(lson,l,mid);build(rson,mid+1,r);pushup(o);}tree query(int o,int l,int r,int ql,int qr){if(ql<=l&&r<=qr)return node[o];bool flag1=ql<=mid,flag2=qr>mid;if(flag1&&flag2)return query(lson,l,mid,ql,qr)+query(rson,mid+1,r,ql,qr);else{if(flag1)return query(lson,l,mid,ql,qr);if(flag2)return query(rson,mid+1,r,ql,qr);}}
}T;
int main()
{int n=read(),m=read(),i,l,r;scanf("%s",s);T.build(1,1,n);for(i=1;i<=m;i++){l=read();r=read();printf("%d\n",T.query(1,1,n,l,r).ans);}return 0;
}

转载于:https://www.cnblogs.com/Creed-qwq/p/10016092.html

正睿 2018 提高组十连测 Day4 T3 碳相关推荐

  1. NOIP 2018提高组复赛C/C++试题及答案详解

    NOIP 2018提高组历年真题 CCF NOIP2018 初赛提高组 C++语言试题 第 1 页,共9 页 第二十四届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2018 年 ...

  2. JZOJ 5794. 2018.08.10【2018提高组】模拟A组省选 旅行

    Description 悠悠岁月,不知不觉,距那传说中的pppfish晋级泡泡帝已是过 去数十年.数十年 中,这颗泡泡树上,也是再度变得精彩,各种泡泡 天才辈出,惊艳世人,然而,似乎 不论后人如何的出 ...

  3. 2018提高组训练Day2

    A 算法 1 对于每组询问,暴力的算出每个二次函数的取值. 时间复杂度 \(O(nq)\).期望得分 \(20\) 分. 算法 2 当 \(x>0\) 时,要求 \(a_ix^2+b_ix\) ...

  4. NOIP 2018 提高组初赛试题 题目+答案+简要解析

    一.单项选择题(共 10  题,每题 2  分,共计 20  分: 每题有且仅有一个正确选项) 1. 下列四个不同进制的数中,与其它三项数值上不相等的是( ). A. (269) 16 B. (617 ...

  5. JZOJ 2018.07.15【2018提高组】模拟C组

    目录: 4024. [佛山市选2015]石子游戏 4025. [佛山市选2015]找回密码 2136. [GDKOI2004]汉诺塔 2137. [GDKOI2004]城市统计 4024. [佛山市选 ...

  6. 2018.07.12【2018提高组】模拟B组 【NOIP2015模拟10.27】魔道研究

    #Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Ma ...

  7. 【NOIP 2018 提高组】填数游戏

    传送门 problem 小 D 特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个 n×mn \times mn×m 的矩形表格.玩家需要在表格的每个格子中填入一个数字(数字 00 ...

  8. 2018.07.18【2018提高组】模拟C组

    前言:再一次OTL JZOJ 3508 好元素 题目 求满足a[m]+a[n]+a[p]=a[i]a[m]+a[n]+a[p]=a[i]a[m]+a[n]+a[p]=a[i]的i的个数 分析 移项后得 ...

  9. JZOJ2018.07.12【2018提高组】模拟B组 魔道研究

    4270. [NOIP2015模拟10.27]魔道研究 题目描述 "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --&l ...

最新文章

  1. 图像的上采样和下采样
  2. 计算机组成原理重要知识,计算机组成原理重要知识点解析
  3. java 1.6 webservice_java jdk1.6内置支持的webservice使用示例
  4. 虚拟化运维平台云安对政府机构的解决方案
  5. jzoj4616-[NOI2016模拟7.12]二进制的世界【平衡规划,dp】
  6. 【C语言进阶深度学习记录】二十三 数组的本质分析
  7. ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行
  8. vue中设置height:100%无效的问题及解决方法
  9. linux c多进程多线程,linux下的C\C++多进程多线程编程实例详解
  10. 原来MySQL面试还会问这些...
  11. NAC、NAP及TNC安全接入技术对比分析
  12. 【C++11】新特性——auto的使用
  13. ELK下Kibana和Elasticsearch之间相互TLS身份验证
  14. 14.5-全栈Java笔记:java.awt这些布局怎么写?|流式|边界|网格
  15. Improving Opencv 4: The Core Functionality :Operations with images
  16. “Flash闪存”基础 及 “SD NAND Flash”产品的测试
  17. 宏碁电脑BIOS没有usb启动项怎么办?
  18. arch 关闭独显_Arch Linux Nvidia 双显卡切换
  19. excel电子表格发展历史
  20. C++之策略(Strategy)模式

热门文章

  1. Entity Framework Core 2.0的突破性变更
  2. 【分块答案】【最小割】bzoj1532 [POI2005]Kos-Dicing
  3. linux 父子进程的关系
  4. Ubuntu make menuconfig与make xconfig
  5. 使用临界区 CRITICAL_SECTION 实现互斥
  6. WD1600AAJS AAKS 固件 数据恢复
  7. django用户认证系统——注册3
  8. python coverage 使用技巧
  9. 11个有用的移动网页开发App和HTML5框架
  10. ASP.NET 2.0 – 如何巢状化GridView控件