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