哔哩哔哩9.1 cpp笔试第二题求问

题目大意是给一个序列{a1, a2, ... , an}, 每次可以给这个序列上所有的数加上一个xi,问每次加完以后序列所有数的绝对值和是多少
我的思路是二分+前缀和。代码如下,只能过20%,不知道是哪里有问题,求各位大佬帮忙看看
ps:我图省事没用long long,提交的代码里使用的是long long
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> vec(n);
    vector<int> pre(n + 1);
    for(int i = 0; i < n; i++) cin >> vec[i];
    sort(vec.begin(), vec.end());
    for(int i = 0; i < n; i++) pre[i + 1] = pre[i] + vec[i];
    int q;
    cin >> q;
    int his = 0;
    while(q--){
        int xi = 0;
        cin >> xi;
        his += xi;
        auto pos = lower_bound(vec.begin(), vec.end(), -his) - vec.begin();
        int lp = pos;
        int rp = n - pos;
        int cursum = pre[pos] * -1 - lp * his + pre[n] - pre[pos] + his * rp;
        cout << cursum << endl;
    }
    return 0;
}


#哔哩哔哩笔试#
全部评论
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 5; int a[N], n, q, x; int main() {     cin >> n;     unordered_map<ll, int> mp;     for (int i = 0; i < n; i++) {         cin >> a[i];         mp[a[i]]++;     }     cin >> q;     ll cur = 0;     while (q--) {         cin >> x;         cur += x;         ll res = 0;         for (auto& kv: mp) {             res += abs(kv.first + cur) * kv.second;         }         cout << res << endl;     }     return 0; }
1
送花
回复 分享
发布于 2022-09-02 12:54 福建
楼主,当数组里的数在-his和0之间的时候,这些数加上his,绝对值的增量不能按照his算吧
点赞
送花
回复 分享
发布于 2022-09-01 21:37 天津
京东
校招火热招聘中
官网直投
楼主,感觉你这思路确实可以,比我简洁多了,我只想到整个数组的求和,没有想到各个下标的前缀和
点赞
送花
回复 分享
发布于 2022-09-01 22:08 北京
二分找的应该是累加上his以后,数组小于0和大于等于0的分界点,然后使用最开始求的前缀和,根据正负数的绝对值的和的特点O(1)求出。
点赞
送花
回复 分享
发布于 2022-09-02 01:45 四川

相关推荐

2 1 评论
分享
牛客网
牛客企业服务