牛客周赛 Round 90 D真爱粉Tk(三)

D. 真爱粉Tk(三)

\(\hspace{15pt}\)众所不周知,Tk 是坤的真爱粉,所以 Tk 对所有与 \(25\) 有关的东西都极其敏感。一天邪恶的黑粉给 Tk 一个长度为 \(n\) 的数组 \(\{a_1,a_2,\dots,a_n\}\),Tk 找到了你,希望你将数组分割成 \(k\) 个非空子区间 \([l_j,r_j]\),其中保证 \(l_1=1,\; r_k=n\) 以及对于任意 \(1<j\leqq k\) 都有 \(r_{j-1}+1=l_j\)
\(\hspace{15pt}\)你要尽可能降低所有子区间中字符子序列 \(25\) 的最大出现次数。请输出你操作后所有子区间中字符子序列 \(25\) 的最大出现次数的最小值.
\(\hspace{15pt}\)字符子序列:在本题中,你可以理解为将数组区间中所有数字按顺序拼接成一个字符串,该字符串中的子序列即为该数组区间的字符子序列。例如,数组 \(\{22,55\}\) 按顺序拼接成字符串 \(2255\),该字符串中有 \(4\) 个子序列为 \(25\),则该数组的字符子序列 \(25\) 个数为 \(4\).

\(\hspace{15pt}\)第一行输入两个整数 \(n,k(1\leqq k\leqq n\leqq2\times10^5)\) 表示数组大小以及要分割的子区间个数.
\(\hspace{15pt}\)第二行输入 \(n\) 个整数 \(a_i(1\leqq a_i\leqq10^9)\) 表示数组 \(a\).

\(\hspace{15pt}\)输出一个整数表示最小化子区间中字符子序列 \(25\) 出现次数的最大值.

输入

5 2
22 55 5555 222 55

输出

6

说明

\(\hspace{15pt}\) 分割区间 \([1,1]\)\([2,5]\)后,第一个区间的字符子序列 \(25\) 个数为 \(0\),第二个区间为 \(6\),所以最终答案为 \(max(\{0,6\})=6\).

思路

首先数字转成字符串读入便于处理,最大化最小值,考虑二分,然后发现根据划分段数二分确实具有单调性,出现数字2的时候记录出现2的次数,出现数字5的时候记录能与前面几个2组成子序列25,维护个数即可。
ps:这么典的二分都不会,赶紧去做114514道二分(

AC code

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const ll inf=1e18;
void solve(){
    int n,k;cin>>n>>k;
    vector<string>a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    auto check=[&](ll mid){
        ll __2=0,__25=0;
        ll cnt=0;
        for(int i=1;i<=n;i++){
            for(int j=0;j<a[i].size();j++){
                if(a[i][j]=='2') __2++;
                else if(a[i][j]=='5') __25+=__2;
            }
            if(__25>mid){
                cnt++;
                __25=0;
                __2=0;
                for(int j=0;j<a[i].size();j++){
                    if(a[i][j]=='2') __2++;
                    else if(a[i][j]=='5') __25+=__2;
                }
            }
        }
        return cnt+1<=k;
    };
    ll l=0,r=inf;
    while(l<=r){
        ll mid=l+r>>1LL;
        if(check(mid)) r=mid-1;
        else l=mid+1;
    }
    cout<<l<<endl;
}
int main(){
    cin.tie(0)->ios::sync_with_stdio(false);
    int T=1;//cin>>T;
    while(T--) solve();
    return 0;
}
posted @ 2025-04-21 15:32  usedchang  阅读(80)  评论(0)    收藏  举报