忘掉过去的人,终将重蹈覆辙。|

chenwenmo

园龄:6个月粉丝:0关注:7

ARC136C Circular Addition [高维前缀和]

Description

给定一个长度为 n 的正整数序列 A,求有多少对 (i,j) 使得 Ai+Aj 不发生进位操作。
Ai<106

Solution

显然对于每个 Ai,设 Bi=999999Ai,那么 Ai 可以和 所有位上的数 都小于等于 Bi 对应位上的数 的数匹配,考虑用桶加前缀和统计(相当于是个 6 维前缀和)。
然后对于每位都 4 的数,是会和它自己匹配的,所以要减 1
最后答案 /2 即可。

Code

const int N = 1e6 + 5;

int n, a[N];
int p[6] = {1, 10, 100, 1000, 10000, 100000};
ll sum[N], ans;

void Solve(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        sum[a[i]]++;
    }
    for(int i = 0; i < 6; i++){
        for(int j = 0; j < 1000000; j++){
            if(j / p[i] % 10){
                sum[j] += sum[j - p[i]];
            }
        }
    }
    for(int i = 1; i <= n; i++){
        ans += sum[999999 - a[i]];
        bool flag = true;
        for(int j = 0; j < 6; j++){
            if(a[i] / p[j] % 10 >= 5){
                flag = false;
                break;
            }
        }
        if(flag) ans--;
    }
    cout << ans / 2 << endl;
}

本文作者:chenwenmo

本文链接:https://www.cnblogs.com/chenwenmo/p/18456611

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   chenwenmo  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起