B蜜汁TLE

用set存,每次删除一个,插入一个,维护两个set即可,复杂度nlogn,怎么TLE了鸭???

#include<bits/stdc++.h>
usingnamespacestd;
constintmaxn = 1e5+7;
constintmaxm = 2e1+7;
constintmod = 1e9+7;
typedeflonglongll;
typedefunsigned longlongull;
 
intn,m,x,y,k;
intar[maxn];
multiset<int> s1,s2;
multiset<int>::iterator it;
voidread(int& x){
    x=0;
    charc = getchar();
    while(c<'0'&& c>'9')c = getchar();
    while(c<='9'&& c>='0'){
        x = x*10+c-'0';
        c = getchar();
    }
}
intmain()
{
    read(n);
    read(m);
    read(k);
    for(inti=1;i<=n;i++)read(ar[i]);
    if(k==0){
        printf("0\n");
        return0;
    }
    ll ans=0,mid=0;
    for(inti=1;i<=m;i++){
        s1.insert(ar[i]);
    }
    while(s2.size()<k){
        it = s1.begin();
        intx = *it;
        s2.insert(x);
        mid += x;
        s1.erase(s1.begin());
    }
    ans = mid;
    for(inti=2;i<=n-m+1;i++){
        intval = ar[i-1];
        if(s1.count(val)){
            s1.erase(s1.find(val));
        }
        else{
            s2.erase(s2.find(val));
            mid -= val;
        }
        val = ar[i+m-1];
        s1.insert(val);
        if(s1.size()>0){
            it = s1.begin();
            intx = *it;
            if(s2.size()>0){
                it = s2.end();
                it--;
                if(*it > x){
                    mid -= *it;
                    s1.insert(*it);
                    s2.erase(it);
                }
            }
        }
        while(s2.size()<k){
            it = s1.begin();
            mid += *it;
            s2.insert(*it);
            s1.erase(it);
        }
        ans += mid;
    }
    printf("%lld\n", ans);
    return0;
}

全部评论

相关推荐

08-07 11:19
门头沟学院 Java
点赞 评论 收藏
分享
昨天 12:10
门头沟学院 运营
点赞 评论 收藏
分享
约会议室面试被+1发现了
积极的悲伤蛙愿off...:这怎么了,我都直接跟带教说投了哪些公司让他帮我看看简历,本来就是阶段性的实习生,别真把自己当正式工了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务