首页 > 其他分享 >OJ周赛第一场——数列

OJ周赛第一场——数列

时间:2022-10-31 15:23:42浏览次数:41  
标签:周赛 OJ int 前缀 数列 序列 例子 区间 翻转

数列  

问题描述

给你一个长度为N的由0和1组成的整数序列:A=(A1,A2,⋯,AN​)。

你可以选择是否进行一个操作。该操作为选择一个区间(l,r) ,使得区间的0变成1,1变成0。

改变后的序列称作A’

我们设f(A)为整数序列A中1的个数。想问你f(A')有多少个取值的可能

 

输入 

第一行一个整数n表示序列的长度。(1≤N≤3×10^5)

第二行n个数,为0或1 

输出 

输出可以操作一次或不操作后的序列f(A')有多少种取值可能。

 

输入例子 1       输出例子 1

4             4
0 1 1 0







输入例子 2       输出例子 2

5             6
0 0 0 0 0

 

输入例子 3       输出例子 3

6
0 1 0 1 0 1       3

 

提示

对于样例一:

翻转(2,3)区间,f(A')=0

翻转(2,2)区间,f(A')=1

  不进行操作,  f(A')=2

翻转(1,1)区间,f(A')=3

一共4种可能

 

提示

首先需要证明对于所有f(A’)的取值是连续的。

我们可以考虑翻转一个区间(l,r),其值为x。

考虑扩展该区间,即r+1或l-1,发现扩展的那位如果是1,那么扩展后区间为x-1如果是0则x+1

同理考虑缩小该区间,则与之前的情况相反。

我们能发现该值只会+1或-1,那么可以证明f(A’)的取值是连续的。

所以必然存在可能使得有翻转区间后f(A’)的最小值,通过滑动区间变为最大值。

 

那么该问题可以进行转换成翻转一个区间使得1的个数最多和最少。

考虑ai为0,翻转后f(A’)+1,为1 f(A’)-1,

所以构造b序列为ai为0时bi为1,为1时bi为-1

然后从前往后扫一遍,构造bi的前缀和s求出Si-Sj最大max和最小min。(j<i)

答案为max-min+1

 

官方答案

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

int main(){
    int n;cin>>n;
    vector<int> s(n+1);
    
    int mx=0,mn=0;
    set<int> f;
    f.insert(0); //记录前缀的前缀和。
    for (int i=1;i<=n;++i){
        int x;cin>>x;
        s[i]=s[i-1] + (x ? -1 : 1); //构造的b的前缀和
        mx=max(mx , s[i] - *f.begin());  //最大值为si减去之前sj的最小值
        mn=min(mn , s[i] - *(--f.end())); //最小值为si减去之前sj的最大值
        f.insert(s[i]);
    }
    cout<< mx - mn + 1;
}

 

标签:周赛,OJ,int,前缀,数列,序列,例子,区间,翻转
From: https://www.cnblogs.com/hihopkc/p/16844403.html

相关文章

  • 斐波那契数列的java实现
    斐波那契数列指的是这样一个数列0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……特别指出:第0项是0,第1项是第一个1......
  • 树上连通有关背包:【BZOJ4182】shopping &【HDU6566】The Hanged Man
    选这两道题是因为这两道题都是树上背包,而且选的点的要求都与连通性有关,而且都是按dfs序DP来模拟不断加入物品,而且都能用树剖和点分治优化(不过优化的点一个跟子树大小有......
  • Berlekamp-Massey 算法(求数列的最短递推式)
    用于求数列的最短递推式。本文参考自https://www.cnblogs.com/jz-597/p/14983564.html。增量法,设\(R_i\)表示第\(i\)个历史递推式,当前为\(R_{cnt}\)。设\(\Delta......
  • 2022年zzuli周赛(2)
    消消乐我们可以考虑贪心,想一想,如果\(s\)串和\(t\)串中有一个字母相同的话,是不是就相当于必然存在\(S,t\)相同(将两个字符串删减成一个字母就可以了)C:#include<stdio......
  • cryptoJs DES_CBC_Pkcs7 转成 Java
    前端DES加密:importcryptoJsfrom'crypto-js';//DES加密functionencrypt(message,key,iv){//字符串转16进制constkeyHex=cryptoJs.enc.Utf8.parse......
  • LeeCode 317周赛复盘
    T1:可被3整数的偶数的平均值思路:数组遍历被3整数的偶数\(\Leftrightarrow\)被6整数的数publicintaverageValue(int[]nums){intsum=0;intcount=0;......
  • leetcode 第90场双周赛
    6226.摧毁一系列目标题意:对于数组中每一个数nums[i],可以摧毁数组中值等于nums[i]+c*space的数(c为非负整数),求摧毁最大数量时的最小nums[i]思路:如果两个数x,y可以同时被摧......
  • 【XSY3434】【UOJ431】time map(线段树维护位运算)
    首先注意到一个性质:如果我们把权值相同且相邻的点归为一个连通块的话,那么一个叶子节点往上会经过至多\(O(\logV)\)个连通块(因为父亲节点一定是儿子节点的子集)。又注意......
  • 求数列和
    #include<stdio.h>intmain(){ floata=1; floatb=2; floatsum=0; floatt; inti; for(i=0;i<20;i++){ sum+=b/a; t=b; b=a+b; a=......
  • 【XSY2444】【BZOJ4042】【CERC2014】【luogu4757】Parades(树形dp+状压dp)
    题面Description从前有个A国,它有\(n\)个城市和\(n-1\)条道路。每条路连接两个城市。城市之间两两可达。每个城市与不超过10条道路相连。现在给出\(m\)条路径,要求从这些......