遗憾|惊险|守银
感觉自己是大赛软脚虾。
一开始整个队没进入状态,前五十分钟就做了一个签到,但是之后在所有人的努力下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;}
}
如果我秒了这题,我们稳金,但是没有如果
