西北工业大学“编程之星”程序设计挑战赛 A 张经理的员工

张经理的员工

https://ac.nowcoder.com/acm/contest/5403/A

解法:
















时间复杂度:

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
const int maxn = 100005;
int a[maxn] , b[maxn];
ll pre[maxn] , fpre[maxn];
ll cpre[maxn] , cfpre[maxn];
int main()
{
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        b[a[i]]++;
    }
    ll sum = 0,sum2 = 0;
    for(int i=1;i<=100000;i++){
        if(b[i]){
            sum += 1ll*i*b[i];
            sum2 += 1ll*b[i];
        }
        pre[i] = sum; 
        cpre[i] = sum2;
    }
    sum = 0,sum2 = 0;
    for(int i=100000;i>=1;i--){
        if(b[i]){
            sum += 1ll*i*b[i];
            sum2 += 1ll*b[i];
        }
        fpre[i] = sum;
        cfpre[i] = sum2;
    }
    while(q--){
        int l,r;
        ll ans = 0;
        scanf("%d %d",&l,&r);
        if(l > r)
            swap(l , r);
        ll x = 1ll*cpre[l]*l - 1ll*pre[l];
        ll y = 1ll*fpre[r] - 1ll*cfpre[r]*r;
        ll z = 0 , w = 0;
        if(r - l > 1){
            int x = r - l;
            int l2 = l + x/2;
            z = pre[l2] - pre[l] - (cpre[l2] - cpre[l])*l;
            int r2 = l2;
            w = r*(cpre[r-1] -  cpre[r2]) - (pre[r-1] - pre[r2]);
        }
        cout<<x + y + z + w<<endl;
    } 
     return 0;
}
acm菜鸡日常 文章被收录于专栏

一般写一些打过的比赛题解以及不会的算法

全部评论
因为给出的查询次数是1e5,所以时间复杂度不能高于log级别, 这句话不理解 ,我只是明白大O时间复杂度,但是不能跟具体的时间联系起来,,这是怎么求的呢,,,求解
点赞 回复 分享
发布于 2020-05-02 12:25
膜拜大佬
点赞 回复 分享
发布于 2020-05-02 13:49
ylstql
点赞 回复 分享
发布于 2020-05-02 14:19
请问w更新改成w = r*(cfpre[r2] - cfpre[r-1]) - (fpre[r2] - fpre[r-1]);为啥不行?
点赞 回复 分享
发布于 2020-05-02 14:20
请问一下,z = pre[l2] - pre[l] - (cpre[l2] - cpre[l])*l;中,既然是中间的值往l靠的距离,为什么后面的项不是乘x/2?
点赞 回复 分享
发布于 2020-05-02 15:00

相关推荐

13 收藏 评论
分享
牛客网
牛客企业服务