传送门

分析

我们假设如果一个点是0则它的值为-1,如果一个点是1则值为1,则一个区间的答案便是max(pre[i]+sur[i]),这里的pre[i]表示此区间i点和它之前的的前缀的最大值,sur[i]表示i点之后的后缀最大值。所以为了维护每个区间的答案我们可以用线段树进行维护。而对于一个由两个区间拼成的区间它的答案只有三种

1. 由左区间所选的pre加上右区间的sur

2. 由左区间的全部加上右区间的pre和sur

3. 由左区间所选的pre和sur加上右区间的全部

而这个区间的答案即为这三种的最大值。

至于为什么是这三种情况请自行画图思考。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
char s[];
int a[];
struct node {
int pre,sur,ans,sum;
};
node d[];
inline void up(int wh){
d[wh].sum=d[wh<<].sum+d[wh<<|].sum;
d[wh].pre=max(d[wh<<].pre,d[wh<<].sum+d[wh<<|].pre);
d[wh].sur=max(d[wh<<|].sur,d[wh<<|].sum+d[wh<<].sur);
d[wh].ans=max(d[wh<<].pre+d[wh<<|].sur,
max(d[wh<<].sum+d[wh<<|].ans,d[wh<<].ans+d[wh<<|].sum));
return;
}
inline void build(int le,int ri,int wh){
if(le==ri){
d[wh].ans=d[wh].pre=d[wh].sur=max(a[le],);
d[wh].sum=a[le];
return;
}
int mid=(le+ri)>>;
build(le,mid,wh<<);
build(mid+,ri,wh<<|);
up(wh);
return;
}
inline node q(int le,int ri,int wh,int x,int y){
if(le>=x&&ri<=y)return d[wh];
int mid=(le+ri)>>;
node ans,a,b;
int cnt=;
if(mid>=x)cnt++,ans=a=q(le,mid,wh<<,x,y);
if(mid<y)cnt++,ans=b=q(mid+,ri,wh<<|,x,y);
if(cnt==)return ans;
ans.sum=a.sum+b.sum;
ans.pre=max(a.pre,a.sum+b.pre);
ans.sur=max(b.sur,b.sum+a.sur);
ans.ans=max(a.pre+b.sur,max(a.sum+b.ans,a.ans+b.sum));
return ans;
}
int main(){
int n,m,i,j,k,x,y;
scanf("%d%d",&n,&m);
scanf("%s",s);
for(i=;i<=n;i++)
if(s[i-]=='')a[i]=-;
else a[i]=;
build(,n,);
for(i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",q(,n,,x,y).ans);
}
return ;
}

ZROI2018提高day4t3的更多相关文章

  1. ZROI2018提高day9t1

    传送门 分析 我们首先想到的自然是根据大小关系建图,在这之后我们跑一遍拓扑排序 但是由于l和r的限制关系我们需要对传统的拓扑排序做一些改变 我们考虑将所有入度为0且现在的拓扑序号已经大于等于l的点放入 ...

  2. ZROI2018提高day6t2

    传送门 分析 将所有字母分别转化为1~26,之后将字符串的空位补全为0,?设为-1,我们设dp[p][c][le][ri]表示考虑le到ri个字符串且从第p位开始考虑,这一位最小填c的方案数,具体转移 ...

  3. ZROI2018提高day6t1

    传送门 分析 我们发现这个四元组可以分解成一个逆序对拼上一个顺序对,这个线段树搞搞然后乘一下就可以求出来了,但是我们发现可能有(a,b)为逆序对且(b,c)为顺序对的情况,所以要进行容斥,我们只需要枚 ...

  4. ZROI2018提高day5t3

    传送门 分析我们可以根据性质将这个序列构造成一个环:0,a[1~n],0,a[n~1] 这中间的0是为了起间隔作用的. 我们又知道b[i]=a[i-1]^a[i+1] c[i]=b[i-1]^b[i+ ...

  5. ZROI2018提高day5t2

    传送门 分析 考场上傻了,写了个树剖还莫名weila...... 实际就是按顺序考虑每个点,然后从他往上找,一边走一边将走过的边染色,如果走到以前染过色的边就停下.对于每一个a[i]的答案就是之前走过 ...

  6. ZROI2018提高day5t1

    传送门 分析 我们不难将条件转换为前缀和的形式,即 pre[i]>=pre[i-1]*2,pre[i]>0,pre[k]=n. 所以我们用dp[i][j]表示考虑到第i个数且pre[i]= ...

  7. ZROI2018提高day4t2

    传送门 分析 我们二分球的直径,然后就像奶酪那道题一样,将所有距离相遇直径的点用并查集连在一起,然后枚举所有与上边的顶距离小于直径的点和所有与下边的距离小于直径的点,如果它们被并查集连在一起则代表这个 ...

  8. ZROI2018提高day4t1

    传送门 分析 一道贪心题,我们用两个优先队列分别维护卖出的物品的价格和买入但没有卖出的物品的价格,然后逐一考虑每一个物品.对于每一个物品如果他比卖出的物品中的最低个价格,则改将现在考虑的物品卖出,将之 ...

  9. ZROI2018提高day3t3

    传送门 分析 我们对于每一个可以匹配的字符都将其从栈中弹出,然后他的哈希值就是现在栈中的字符哈希一下.然后我们便可以求出对于哪些位置它们的哈希值是一样的,即它们的状态是一致的.而这些点可以求出它们的贡 ...

随机推荐

  1. syq小姐姐的分享的历年考试经验

    一>读题 10~20min浏览题目,把握题目方向和做题大致顺序 不要轻敌,最好先看完题目,大概掌握整套题的难度顺序再动手 仔细读题步骤: (1)文件名(也是检查的重点,绝对重要,注意区分l和1和 ...

  2. MFC获得当前应用程序目录的GetCurrentDirectory()和GetModuleFileName()函数

    在 开发过程中经常需要获得程序当前的运行目录,这时就可以使用GetCurrentDirectory()和GetModuleFileName()函 数,GetCurrentDirectory只是返回当前 ...

  3. Zijian-lv #3 树句节狗提

    如你所见,这是一道狗题 一棵树,多次询问与一个点距离至少为 $k$ 的点的权值和 $n,q \leq 2525010$ sol: 长链剖分 需要注意的是这道题卡空间 我把我所有的 vector 换成链 ...

  4. Gym - 100623J Just Too Lucky (数位dp)

    给定n∈[1,1e12],求1到n的所有整数中,各位数字之和能整除它本身的数的个数. 这道题与UVA-11361类似,假如设dp[u][lim][m1][m2]为枚举到第u位(从低到高数),是否受限, ...

  5. LeetCode Shopping Offers

    原题链接在这里:https://leetcode.com/problems/shopping-offers/description/ 题目: In LeetCode Store, there are ...

  6. JSplitPane的简单实现

    import java.awt.Color; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.J ...

  7. centos6.5 安装gcc 4.9.0

    wget http://gcc.skazkaforyou.com/releases/gcc-4.9.0/gcc-4.9.0.tar.gz  // 下载源码 tar -zxvf gcc-4.9.0 cd ...

  8. extern关键字祥解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  9. java从键盘输入数,分解质因数,

    总结:1.break;的用法 当最小质因数不能被输入的值整除时,需要继续循环.k++. 当然输入的数,本身就是质数时,那么 package com.b; import java.util.Scanne ...

  10. Excel开发学习笔记:VB.net的一些杂项

    遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VST ...