题目传送门:https://www.luogu.org/problemnew/show/P3514

题意:给出一个只有$1$和$2$的长度为$N$的数列,$M$次询问是否存在一段连续子区间和为$K$。$N,M \leq 10^6$


考虑存在答案为$Q$的区间会对其他答案有什么影响。然后能够发现:如果存在答案为$Q$的区间,就一定存在$\leq Q$且奇偶性相同的其他区间

证明:对于答案为$Q$的区间$(Q \geq 2)$,我们有以下方式递推出和为$Q - 2$的区间:

$a.num_l == 2,$新区间为$l+1,r$

$b.num_r == 2,$新区间为$l,r-1$

$c.num_l==num_r==1,$新区间为$l+1,r-1$

所以我们可以算出数列中和最大的和为奇数的区间与和为偶数的区间,并用它递推出所有答案区间,最后$O(1)$回答询问即可。

 #include<bits/stdc++.h>
 #define MAXN 1000010
 using namespace std;

 ][] , N , M;

 inline void culJi(int maxJi);
 inline void culOu(int maxOu);

 int main(){
     ios::sync_with_stdio();
     cin.tie();
     cout.tie();
     string s;
     cin >> N >> M >> s;
     ;
      ; i <= N ; i++)
         sum += (num[i] = s[i - ] ==  : );
     ans[sum][] = ;
     ans[sum][] = N;
     )
         culJi(sum);
     else
         culOu(sum);
      , q = N;
     )
         p++;
     )
         q--;
     if(p <= q){
          < N - q){
             sum -= (p -  << ) + ;
             ans[sum][] = p + ;
             ans[sum][] = N;
         }
         else{
             sum -= (N - q << ) + ;
             ans[sum][] = ;
             ans[sum][] = q - ;
         }
         )
             culJi(sum);
         else
             culOu(sum);
     }
     while(M--){
         int a;
         cin >> a;
         ])
             cout << ans[a][] << ] << '\n';
         else
             cout << "NIE\n";
     }
     ;
 }

 void culJi(int maxJi){
     ){
         ]] == ){
             ans[maxJi - ][] = ans[maxJi][] + ;
             ans[maxJi - ][] = ans[maxJi][];
         }
         else
             ]] == ){
                 ans[maxJi - ][] = ans[maxJi][];
                 ans[maxJi - ][] = ans[maxJi][] - ;
             }
             else{
                 ans[maxJi - ][] = ans[maxJi][] + ;
                 ans[maxJi - ][] = ans[maxJi][] - ;
             }
         maxJi -= ;
     }
 }

 void culOu(int maxOu){
     ){
         ]] == ){
             ans[maxOu - ][] = ans[maxOu][] + ;
             ans[maxOu - ][] = ans[maxOu][];
         }
         else
             ]] == ){
                 ans[maxOu - ][] = ans[maxOu][];
                 ans[maxOu - ][] = ans[maxOu][] - ;
             }
             else{
                 ans[maxOu - ][] = ans[maxOu][] + ;
                 ans[maxOu - ][] = ans[maxOu][] - ;
             }
         maxOu -= ;
     }
 }

Luogu3514 POI2011 Lollipop 递推、构造的更多相关文章

  1. hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

    题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...

  2. [ 9.24 ]CF每日一题系列—— 468A构造递推

    Description: 1 - n个数问你能否经过加减乘除这些运算n -1次的操作得到24 Solutrion: 一开始想暴力递推,发现n的范围太大直接否决,也否决了我的跑dfs,后来就像肯定有个递 ...

  3. HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...

  4. HDU4565 So Easy! —— 共轭构造、二阶递推数列、矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4565 So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  5. poj2166 Heapsort[构造递推]

    构造一个n个点的大根堆让全部弹出时交换位置次数最多. 真心佩服我自己智商,这种题都做不出来 交换是在每次弹出堆顶,然后把堆尾元素置于堆顶,然后向下调整时产生的.玩样例可以发现似乎数字1每次都出现在堆最 ...

  6. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

  7. 利用Cayley-Hamilton theorem 优化矩阵线性递推

    平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...

  8. HDU 2842 (递推+矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...

  9. P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)

    https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...

随机推荐

  1. 《Inside C#》笔记(十二) 委托与事件

    C#的委托与C++的函数指针类似,但委托是类型安全的,意味着指针始终会指向有效的函数.委托的使用主要有两种:回调和事件. 一 将委托作为回调函数 在需要给一个函数传递一个函数指针,随后通过函数指针调用 ...

  2. Angular2 富文本编辑器 ng2-ckeditor 的使用

    本文介绍如何在 Angular 中使用 ng2-ckeditor 控件,示例代码基于 angular 6.0.2,node 8.11.2,  ng2-ckeditor 4.9.2 环境   1. 安装 ...

  3. Python机器学习入门

    # NumPy Python科学计算基础包 import numpy as np # 导入numpy库并起别名为npnumpy_array = np.array([[1,3,5],[2,4,6]])p ...

  4. 洗礼灵魂,修炼python(55)--爬虫篇—知识补充—RFC 2616 http状态码

    不多说直接上状态码表: 状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽 ...

  5. MongoDB的安装与python操作MongoDB

    一.安装MongoDB 因为我个人使用的是windows,就只记录下windows下的安装 1.下载安装 就是官网,下载msi,选个路径安装 2.配置 看见别的地方说需要手动在bin同级目录创建dat ...

  6. Kubernetes 核心概念

    什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...

  7. VS2015安装与C++进行简单单元测试

    1:VS2015是微软最新发布的编译器,http://www.itellyou.cn/这是我们的北航大神助教提供的下载网址,以前我们都是自己在网上找,找到的总不是那么如意,这下大神助教提供的网址就好好 ...

  8. 支付宝alipay移动支付

    通过支付宝提供的API实现移动支付功能 一:下载相关的依赖和工具 蚂蚁金服 https://open.alipay.com/platform/home.htm 移动支付开发文档 https://doc ...

  9. Java中BufferedReader到底是一个什么类?

    1.java.io.BufferedReader 和 java.io.BufferedWriter 类各拥有8192字符的缓冲区.当BufferedReader在读取文本文件时,会先尽量从文件中读入字 ...

  10. Linux Java 环境配置及内置tomcat部署

    tar zxvf jdk-8u101-linux-x64.tar.gz vi /etc/profile JAVA_HOME=/home/puma/jdk1.8.0_111JAVA_BIN=/home/ ...