_Phoebe__ 2022-01-13 19:50 采纳率: 96.9%
浏览 32
已结题

这个代码看不太懂 想让大家给我解释一下是什么意思(洛谷 p1114)

题目在这里:https://www.luogu.com.cn/problem/P1114


#include <bits/stdc++.h>
using namespace std;
int l[200010],r[200010],sum1,sum0,ans,n;
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++){
        int x; cin>>x;
        sum1+=(x==1), sum0+=(x==0);
        int t=sum0-sum1+n;
        if (!l[t]&&t!=n) l[t]=i; else r[t]=i;
    }
    for (int i=0;i<=2*n;i++) ans=max(ans,r[i]-l[i]);
    cout<<ans<<endl;
    return 0;
}

  • 写回答

1条回答 默认 最新

  • 心怀啊 2022-01-14 02:28
    关注

    sum0-sum1表示的是0与1数量的差值,可能为负数,加上n就转为非负数了。l[t]表示的是当人数最少的时候,0与1差值为t时,此时的人数i,当l[t]为0时,代表在之前的遍历中还没有出现0与1差值为t,所以将此时的人数i赋值给它。当t=n时表示此时0和1的数量相同,l[n]必须保持为0;r[t]表示0与1差值为t时,此时人数的最大值i,l[t]不等于0则表示之前出现过0与1差值为t,后续只更新r[t],当t==n时,此时的人数i符合0与1数量相同。
    r[i]-l[i]表示0和1数量相同时的人数,当i为n时,此时0与1数量本就相同所以保持l[n]为0。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月22日
  • 已采纳回答 1月14日
  • 创建了问题 1月13日

悬赏问题

  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi