E. Final Countdown

原题链接

题解

本题中,每一位数字的每一次变化都会对答案贡献1,所以对于第 \(i\) 位数字而言,它的贡献为从最左边到现在的数,设为 \(f[i]\)

所以答案为 \(\sum_{i=1}^{n}f[i]\),可以用高精度加法解决
然而这样一来时间复杂度就超了 \(O(t·n^2)\)

所以我们尝试从中找寻一些规律
我们发现,第 \(i\) 的数字会对答案 \([1,n-i+1]\) 位上的数字贡献加 \(s[i]\)
而我们统计每一位数字又是线性的, 即我们在统计完第 \(i\) 位的数字时,还要再统计 \(n-i\) 个数字
所以我们可以在 \(O(t·n)\) 的时间内完成

code

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int a[400005]={0};
        int n;
        cin >> n;
        char s[n+5];
        scanf("%s",s+1);
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            cnt+=s[i]-'0';
            a[n-i+1]=cnt;
        }

        for(int i=1;i<=n;i++)
        {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }

        int start=n+1;
        if(a[start])
        {
            while(a[start])
            {
                a[start+1]=a[start]/10;
                a[start]%=10;
                start++;
            }
            start--;
        }
        else
        {
            while(!a[start])start--;
        }
        for(int i=start;i>=1;i--)cout<<a[i];
        puts("");
    }

    return 0;
}

posted @ 2024-02-18 22:53  纯粹的  阅读(72)  评论(0)    收藏  举报