首页 > 其他分享 >Codeforces 1446D2 Frequency Problem (Hard Version)

Codeforces 1446D2 Frequency Problem (Hard Version)

时间:2024-03-01 11:11:07浏览次数:20  
标签:1446D2 int Hard 个数 sqrt Version ans 众数 maxn

考虑求出全局的众数 \(A\)。
那么有一个结论,就是答案区间的众数中绝对有 \(A\)。
考虑反证法,如果没有 \(A\),\(A\) 在序列中出现的个数一定 \(\ge\) 区间内众数的出现个数,所以可以一直往外扩展直到 \(A\) 出现的个数与区间内非 \(A\) 众数的个数持平,这样肯定更优。

于是可以考虑钦定区间的另一个众数为 \(B\)。
那么把 \(a_i = A\) 的看作 \(1\),\(= B\) 的看作 \(-1\),其他的看作 \(= 0\)。
那么 \(\sum = 0\) 的区间就说明 \(A, B\) 个数相同,便可以统计进答案。
可以做出前缀和维护每种前缀和最先出现的位置得到答案。
时间复杂度 \(O(nV)\),\(\text{Easy Version}\) 的做法。

因为每种数出现个数之和 \(= n\),考虑根号分治。
对于出现次数 \(> \sqrt{n}\) 的做这种操作。

对于出现次数 \(\le \sqrt{n}\) 的,考虑枚举众数的出现个数 \(c\)。
考虑双指针维护,如果 \(r - 1\) 扩展到 \(r\) 后 \([l, r]\) 内 \(a_r\) 的出现次数 \(> c\),不符合条件,就考虑一直删掉 \(l\) 位置的数直到 \(a_r\) 的出现次数 \(= c\)。
如果对于 \([l, r]\) 满足有至少 \(2\) 种数出现次数是 \(c\),就是一个合法的区间。

时间复杂度 \(O(n\sqrt{n})\)。

代码
#include<bits/stdc++.h>
const int maxn = 4e5 + 10;
int a[maxn];
int cnt[maxn], L[maxn];
int main() {
    int n; scanf("%d", &n);
    int len = sqrt(n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++) cnt[a[i]]++;
    int A = 1;
    for (int i = 1; i <= n; i++) cnt[i] > cnt[A] && (A = i);
    int ans = 0;
    memset(L, -1, sizeof(L));
    for (int B = 1; B <= n; B++) {
        if (A == B || cnt[B] <= len) continue;
        int tot = 0; L[n] = 0;
        for (int i = 1; i <= n; i++) {
            if (a[i] == A) tot++;
            else if (a[i] == B) tot--;
            if (~ L[tot + n]) ans = std::max(ans, i - L[tot + n]);
            else L[tot + n] = i;
        }
        tot = 0, L[n] = -1;
        for (int i = 1; i <= n; i++) {
            if (a[i] == A) tot++;
            else if (a[i] == B) tot--;
            L[tot + n] = -1;
        }
    }
    for (int mx = 1; mx <= len; mx++) {
        memset(cnt, 0, sizeof(cnt));
        int tot = 0;
        for (int r = 1, l = 1; r <= n; r++) {
            if (cnt[a[r]] == mx) {
                while (a[l] != a[r]) tot -= (cnt[a[l]]-- == mx), l++;
                l++; 
            } else tot += (++cnt[a[r]] == mx);
            tot >= 2 && (ans = std::max(ans, r - l + 1));
        }
    }
    printf("%d\n", ans);
    return 0;
}

标签:1446D2,int,Hard,个数,sqrt,Version,ans,众数,maxn
From: https://www.cnblogs.com/rizynvu/p/18046545

相关文章

  • [思维] [树形数据结构] CF1379F1 Chess Strikes Back (easy version)
    注意到棋盘大小为$2n,2m$,共$2nm$个白格,同时国王数量为$nm$,尝试将$2$个国王捆绑在一块,即将棋盘均匀划分为若干个$2*2$大小的大格子。在此基础上观察,显然同一个大格子内的两个白格不能同时放置国王,同时大格子数量为$nm$,因此问题转化为判定能否使得所有大格子都有一个国王,......
  • CF1209G2 Into Blocks (hard version) 题解
    Description给你\(n\),\(q\),\(n\)表示序列长度,\(q\)表示操作次数。我们需要达成这么一个目标状态:如果存在\(x\)这个元素,那么必须满足所有\(x\)元素都必须在序列中连续。然后你可以进行这么一种操作,将所有的\(x\)元素的变为任意你指定的\(y\)元素,并且花费\(cnt[x......
  • B. Minimize Inversions
    原题链接题解逆序对数最小的排列是严格升序的排列,因此我猜想有一个严格升序的排列最优的证明;冒泡排序,我们把排列a中最大的元素不断地往右作相邻对换,这样一来,序列a的逆序对数必定减少一,序列b的逆序对数可能减少一,可能不变,可能加一,但是两个排列的总逆序对数不可能增加。然后再......
  • cf1446d2-solution
    CF1446D2Solutionlink首先,最终答案区间中的众数一定包括整个序列的众数\(K\)。证明:设这个区间中众数出现次数为\(cnt\)。如果上述不成立,由于\(K\)在这个区间中出现次数小于\(cnt\),我们将区间向两边延申,\(K\)的出现次数应当不断增加直到等于区间的众数出现次数。这样子......
  • 聊聊maven指定version区间的妙用
    前言在我们开发微服务项目的过程中,难免会依赖各种jar,开发环境可能引用1.0.0-SNAPSHOT,而到了正式环境,则需要引用1.0.0。之前我们的做法是通过pom配置profile来达到不同环境,使用不同的版本。形如下<profiles><!--开发环境--><profile><properti......
  • I recommend a very small Linux, it is Watt OS version 13
    Dearall,MyfirsttimeusingLinuxWattOSversion12,itisverynice. Superfast!However,fornewusers,youneedthesecommandtostart:sudopasswdsudodate--setmm/dd/yyyysudoaptinstallgdebiItisworthytostudythesecommandline,because......
  • vue页面上显示package.json中的version
    在Vue项目中,你可以使用process.env来访问构建时注入的环境变量,包括package.json中的某些字段。但是,process.env通常不会直接包含package.json的所有内容。不过,你可以通过构建脚本将version字段注入到环境变量中。以下是如何在Vue项目中获取package.json中的version字段的步骤:在......
  • vue项目npm run build的时候自动更新package.json中的version
    在vue项目最外侧新增一个addVersion.js 脚本,脚本中编写逻辑来解析当前的版本号//addVersion.jsconstfs=require('fs');constpath=require('path');constpackageJsonPath=path.join(__dirname,'package.json');try{//读取package.json......
  • 安装IntelliJ IDEA Ultimate Version 2018.3.6
    参考博客:idea2018.3.6安装与破解教程1、下载安装文件ideaIU-2018.3.6.exe2、无脑下一步安装博主安装位置D:\IntelliJIDEA2018.3.6安装后,先不要运行IDEA3、下载jar文件JetbrainsIdesCrack-4.2-release.jar将下载后的jar包放入到IDEA安装目录的bin目录下,即D:\Inte......
  • 遇到Failed to get response from https://registry.npm.taobao.org/vue-cli-version-
    1.问题在启动vueui时,总是遇到报错,如下图:2.解决参考:vuecli创建项目报错:Failedtogetresponsefrom/vue-cli-version-marker找到你的.vuerc文件:C:\Users\trmbh\.vuerc,这里根据自己的用户名更改然后改为{"useTaobaoRegistry":false,"packageManager":"npm"}第......