导航

省赛游记

Posted on 2025-11-16 01:49  tttfred  阅读(0)  评论(0)    收藏  举报

遗憾|惊险|守银

感觉自己是大赛软脚虾。
一开始整个队没进入状态,前五十分钟就做了一个签到,但是之后在所有人的努力下10分钟一道把签到题全做完了

开始开E,看到最大数字,被去年顾影自怜影响了,实际应该是yamakasi(最大值为x,和为s)
只需维护两个vector即可,若最大数大于k,清空tmp,cnt;等于k,设f为1(f为1则开始统计答案),把tmp复制到cnt,然后tmp[sum[i]%k]++(维护L-1);小于k,若f为1,统计答案,tmp++;

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int tt;
    cin >> tt;
    while (tt--)
    {
        int n;
        cin >> n;
        vector<int> p(n + 1, 0);
        vector<int> sum(n + 1, 0);
        vector<int> d(n + 1, 0);
        int t;
        for (int i = 1; i <= n; i++)
        {
            cin >> p[i];
            sum[i] = sum[i - 1] + p[i];
            t = 0;
            while (p[i])
            {
                t = max(t, p[i] % 10);
                p[i] /= 10;
            }
            d[i] = t;
        }
        int ans = 0;
        for (int k = 1; k <= 9; k++)
        {
            int f = 0;
            vector<int> tmp(k, 0), cnt(k, 0);
            tmp[0] = 1;
            cnt[0] = 1;
            vector<int> blk(k, 0);
            for (int i = 1; i <= n; i++)
            {
                if (d[i] < k)
                {
                    if (f == 1)
                        ans += cnt[sum[i] % k];
                    tmp[sum[i] % k]++;
                }
                else if (d[i] == k)
                {

                    f = 1;
                    cnt = tmp;
                    ans += cnt[sum[i] % k];
                    tmp[sum[i] % k]++;
                    // tmp = blk;
                }
                else
                {
                    f = 0;
                    tmp = blk, cnt = blk;
                    tmp[sum[i - 1] % k]++;
                }
            }
            // cout << k << " " << ans << endl;
        }
        cout << ans << endl;
    }
}

如果我秒了这题,我们稳金,但是没有如果