首页 > 其他分享 >Codeforces 1446D1 Frequency Problem (Easy Version)

Codeforces 1446D1 Frequency Problem (Easy Version)

时间:2024-03-01 11:13:55浏览次数:22  
标签:1446D1 int 个数 Codeforces Version maxn 众数 区间

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

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

代码
#include<bits/stdc++.h>
const int maxn = 4e5 + 10;
int a[maxn];
int cnt[maxn], L[maxn];
int main() {
    int n; scanf("%d", &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 <= 100; i++) cnt[i] > cnt[A] && (A = i);
    int ans = 0;
    memset(L, -1, sizeof(L));
    for (int B = 1; B <= 100; B++) {
        if (A == B) 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;
        }
    }
    printf("%d\n", ans);
    return 0;
}

标签:1446D1,int,个数,Codeforces,Version,maxn,众数,区间
From: https://www.cnblogs.com/rizynvu/p/18046533

相关文章

  • Codeforces 1446D2 Frequency Problem (Hard Version)
    考虑求出全局的众数\(A\)。那么有一个结论,就是答案区间的众数中绝对有\(A\)。考虑反证法,如果没有\(A\),\(A\)在序列中出现的个数一定\(\ge\)区间内众数的出现个数,所以可以一直往外扩展直到\(A\)出现的个数与区间内非\(A\)众数的个数持平,这样肯定更优。于是可以考虑钦......
  • Codeforces 932D Tree
    首先有个动态加叶子的操作,考虑到树剖需要离线下来预处理,便考虑用倍增来维护。首先要找到\(\gea_u\)的最深的父亲\(v\),便可以先用倍增处理好长度为\(2^i\)的链上的\(\max\)。如果\(\max<a_u\),就往上跳,跳不了就是到点\(v\)了。考虑连边\(v\tou\),这仍然会是一棵树(建......
  • Codeforces 1455E Four Points
    首先确定每个点最后走到的是哪一个点。这部分可以枚举全排列。假设左上角的点为\((x_0,y_0)\),右上角的点为\((x_1,y_1)\),左下角的点为\((x_2,y_2)\),右下角的点为\((x_3,y_3)\)。令最终的点为\((x'_0,y'_0)\),以此类推。那么最终的答案就是\(\sum\limits_{i=0}^3|......
  • Codeforces 451E Devu and Flowers
    首先考虑没有\(f_i\)的限制的时候,此时可以用插板法得到方案数为\(\binom{s+n-1}{n-1}\)。考虑钦定\(f_i\)不合法,那么就相当于先在\(i\)这里选\(f_i+1\),剩下的随意分配,方案数就为\(\binom{s-(f_i+1)+n-1}{n-1}\)。算完过后能发现会算重存在\(>1\)......
  • Codeforces 1830C Hyperregular Bracket Strings
    考虑到区间的限制\([l,r]\)就是要求\([l,r]\)里的字符会在\([l,r]\)里找到匹配。假设还有个区间\([l',r']\)满足\(l\lel'\ler\ler'\),能够发现限制变成了\([l,l'),[l',r],(r,r']\)这\(3\)个区间内的字符能在对应区间内找到匹配。继续,假设\(l\lel'\le......
  • [思维] [树形数据结构] CF1379F1 Chess Strikes Back (easy version)
    注意到棋盘大小为$2n,2m$,共$2nm$个白格,同时国王数量为$nm$,尝试将$2$个国王捆绑在一块,即将棋盘均匀划分为若干个$2*2$大小的大格子。在此基础上观察,显然同一个大格子内的两个白格不能同时放置国王,同时大格子数量为$nm$,因此问题转化为判定能否使得所有大格子都有一个国王,......
  • Codeforces 863E Turn Off The TV
    能发现其实就是区间加查询区间最小值。如果最小值\(>1\)则这个区间可以删掉。考虑离散化端点,先把区间表示为\([l_i,r_i)\)的形式,方便离散化端点。这样子离散化出来的端点也是\([x,y)\)的形式。对于区间加查询区间最小值,很容易用线段树维护。时间复杂度\(O(n\logn)......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)A-TurtlePuzzle:RearrangeandNegate代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pa......
  • 13 Codeforces Round 886 (Div. 4)G. The Morning Star(简单容斥)
    G.TheMorningStar思路:用map记录x,y,以及y-x、y+x从前往后统计一遍答案即可公式\(ans+=cnt[x]+cnt[y]-2*cnt[x,y]+cnt[y+x]+cnt[y-x]\)\(cnt[x]+cny[y]-2*cnt[x,y]\)是统计坐标轴方向的,-2倍是需要把本身这个点给减去容斥是减一倍,这里还需要把自己给挖掉\(cnt[y+x]+cnt[y......
  • Codeforces 264E Roadside Trees
    首先考虑时间增长的问题,设第\(i\)棵树的种植时间为\(t_i\)。那么第\(x\)棵树比第\(y\)棵树高就是\(h_x+(t_y-t_x)>h_y\),也就是\(h_x-t_x>h_y-t_y\)。所以可以直接用\(h_i-t_i\)当作第\(i\)棵树的高度,即\(h'_i\leftarrowh_i-t_i\)。对于增加,考虑......