关于队里面最菜的在博客打卡第十一天这件事

这是一道图论的结论并且附带一些数学推公式的题

题目链接:Problem - 1540A - Codeforces

题目如下

在教室推结论结果推错了找了半天bug哎

一下是代码

:因为乘的话有可能会爆long long 于是用int128去存了

#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#include<vector>

using namespace std;
typedef long long int LL ;
typedef pair<__int128,__int128> PII;
const int N = 1e5 + 10;
LL a[N];
__int128 a1[N];
__int128 a2[N];

void print(__int128 x)
{
    if(x < 0)
    {
        cout <<'-';
        x = -x;
    }
    if(x > 9)
        print(x/10);
    putchar(x % 10 + '0');
}
int main()
{   
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        unordered_map<LL,LL> mp;
        int x;
        LL num = 0 ;
        for(int i = 1; i<= n ; i ++)
        {   
            cin >> x;
            if(i != 1 && x == 0)
            {
                num ++ ;
                continue;
            }
            mp[x] ++ ;
        }
        vector<PII> v;
        for(auto it : mp)v.push_back({it.first,it.second});
        sort(v.begin(),v.end());
        __int128 sum = 0 ;
        a1[0] = 1;
        for(int i = 0 ; i < v.size() ; i ++)
        {
            if(i)sum += (v[i].first - v[i-1].first);
            if(i > 0)
            {
                a1[i] = a1[i-1] + v[i].second;
                a2[i] = a2[i-1] + v[i].first * v[i].second;
                sum -= (v[i].first * a1[i-1] - a2[i-1]) * v[i].second;
            }
        }
        if(num)for(int i = 0 ; i < v.size() ; i ++)
        {
            sum -= v[i].first * v[i].second * num ;
        }
        print(sum);
        cout <<endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值