1 条题解

  • 0
    @ 2025-8-24 21:33:41

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar kikuss
    **

    搬运于2025-08-24 21:33:41,当前版本为作者最后更新于2018-09-05 21:01:24,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Solution

    set极简AC,看题解那么多自己打的平衡树,其实STL挺好用的

    现在碰到平衡树的题目一般都是vector或者是set水过去,

    比如这道题....

    题目要求不能重复,set啊,什么都不用判断,直接插入,方便

    只是要注意的set的end函数和vector一样是开区间,而set的迭代器又只支持 --++++操作,所以在删除最大值的时候记得将迭代器--


    Code

    #include<bits/stdc++.h>
    #define lol long long
    #define il inline
    #define rg register
    #define Min(a,b) (a)<(b)?(a):(b)
    #define Max(a,b) (a)>(b)?(a):(b)
    
    using namespace std;
    
    const int N=1e5+10;
    
    void in(lol &ans)
    {
        ans=0; lol f=1; char i=getchar();
        while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
        while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0', i=getchar();
        ans*=f;
    }
    
    struct node {
        lol x,v;
        bool operator < (const node & a) const {return v<a.v;}
    };
    set<node>v;
    
    int main()
    {
        lol op,x,y; node tmp;
        while(1) {
            in(op);
            if(op==1) {
                in(x),in(y);
                tmp = (node) {x,y};
                v.insert(tmp);
            }
            else if(op==2) {if(v.size()) v.erase(--v.end());}
            else if(op==3) {if(v.size()) v.erase(v.begin());}
            else {
                lol ans1=0,ans2=0;
                for(set<node>::iterator it=v.begin();it!=v.end();it++) ans1+=(*it).x,ans2+=(*it).v;
                printf("%lld %lld\n",ans1,ans2);
                return 0;
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1038
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者