首页 > 其他分享 >洛谷 P1114 “非常男女”计划 (前缀和)

洛谷 P1114 “非常男女”计划 (前缀和)

时间:2022-09-22 21:56:49浏览次数:84  
标签:洛谷 前缀 minn LL cin maxn mp P1114

https://www.luogu.com.cn/problem/P1114

题目大意:
给定一排数字,让我们求出最大的区间内1和0的个数相等时的区间长度。
输入
9
0 1 0 0 0 1 1 0 0
输出
6

输入
10
0 1 1 1 1 1 0 0 0 0 
输出
10

虽然这题给我磨出来了,但是还是想写一篇题解记录一下思维

  • 遇到0时候可以采取➕1,遇到1的时候➖1

  • (0➖1,1➕ 1也行,看自己的习惯,答案都是一样的)

  • 然后我们可以发现,任意两个相同的s[i]数字的位置内部,1和0的个数一定是均衡的

  • 所以就直接转换到比较相同的数字的左右之差就行了

温馨提醒0的位置

  • 一开始没有任何数字的时候0就已经存在了,所以0的左边其实就已经固定好了在0这个位置

不理解的话可以手动模拟一下样例二(一开始卡我的地方也就是这里)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=500200,M=2002;
#define l first
#define r second
LL a[N],s[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        map<LL,PII> mp;
        LL maxn=0,minn=0;
        for(LL i=1;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]==1) s[i]=s[i-1]+1;//遇到1直接加1
            else s[i]=s[i-1]-1;//遇到0直接退一步
            minn=min(minn,s[i]);
            maxn=max(maxn,s[i]);
            if(s[i]!=0&&mp[s[i]].l==0) mp[s[i]].l=i,mp[s[i]].r=i;
            else mp[s[i]].r=i;
            //cout<<s[i]<<" ";
        }
       // cout<<endl;
        //cout<<minn<<" "<<maxn<<endl;
        LL ans=0;
        for(LL i=minn;i<=maxn;i++)
        {
            //cout<<mp[i].l<<" "<<mp[i].r<<endl;
            ans=max(ans,mp[i].r-mp[i].l);
        }
        cout<<ans<<endl; 
    }
    return 0;
}

标签:洛谷,前缀,minn,LL,cin,maxn,mp,P1114
From: https://www.cnblogs.com/Vivian-0918/p/16720979.html

相关文章

  • 洛谷 P1025 [NOIP2001 提高组] 数的划分 (dfs)
    https://www.luogu.com.cn/problem/P1025给定一个n和k,把n拆分成k个数字的和,数字可以相同,但是种类不能相同。求能凑出的数量。输入73输出4明明是一道很简单的dfs,......
  • AcWing 133/洛谷2827 蚯蚓
    首先考虑根据题意模拟#include<bits/stdc++.h>#defineintlonglong//懒死谁了usingnamespacestd;typedeflonglongllinlinevoidrd(int&x){x=0;b......
  • 洛谷P1290 欧几里德的游戏
    链接:https://www.luogu.com.cn/problem/P1290不妨假设\(b\leqa\)。显然,当\(a\)是\(b\)的倍数时,为必胜态。接下来考虑\(a\)不为\(b\)的倍数时:1.\(a\)小于\(2*b\)时,当前......
  • 洛谷P3372【模板】线段树1
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e6+5;intn,m,a[N];intadd[N*4];//账本longlongsum[N*4];//a[k]的区间和voidbuild(intk,intl,i......
  • 22张图带你深入剖析前缀、中缀、后缀表达式以及表达式求值
    22张图带你深入剖析前缀、中缀、后缀表达式以及表达式求值一、基本概念在本篇文章当中主要跟大家介绍以下几点前缀、中缀和后缀表达式。如何将中缀表达式转化成后缀表......
  • 洛谷真题字典树
    P8306【模板】字典树1#include<bits/stdc++.h>2usingnamespacestd;3intt,n,q;4constintmaxn=3000005;5chars[maxn];6intson[maxn][80],cnt[ma......
  • 如何编写一个函数来查找字符串数组中的最长公共前缀,说明:所有输入只包含小写字母a~z ,如
      先新建一个类,因为我们肯定要在类里面写,在main方法里调用(为求好理解这里我用的默认名,请勿纠结)     首先我们要想到函数中的字符串最好是要用户自行输入......
  • 洛谷 P1123 取数游戏(dfs)
    https://www.luogu.com.cn/problem/P1123题目大意:给定一个n*m的矩阵,问我们从里面怎样取能取到最大的总和?条件是选了一个数,下次它的八个方向上的数字就不能选了输入#1......
  • 基础前缀和
    https://www.acwing.com/problem/content/797/#include<cstring>#include<algorithm>#include<cstdio>#include<iostream>usingnamespacestd;constintN=1e5+5;......
  • 洛谷P1262 间谍网络(tarjan求强连通分量+缩点)
    题目链接:https://www.luogu.com.cn/problem/P1262思路:首先,我们能够知道,入读为0的点如果不能被收买的话,那么此题是无解的。其次,如果图中存在环的话,那么环中每个点的......