[TJOI2013]奖学金

想一想我还是一个要写主席树的人

然后我水了一道优队的题

额……

#include<bits/stdc++.h>
#define re return
#define ll long long 
#define dec(i,l,r) for(int i=l;i>=r;--i)
#define inc(i,l,r) for(int i=l;i<=r;++i)

using namespace std;
template<typename T>inline void rd(T&x)
{
    char c;bool f=0;
    while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
    x=c^48;
    while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
    if(f)x=-x;
}
const int maxn=2e5+5,maxm=1e6+5;
int n,c,F,L[maxn],R[maxn];
struct node
{
    int grade,mon;
    bool operator<(node a)const 
    {
        re grade<a.grade;
    }
}peo[maxn];    

priority_queue<int>q,q1;
int main()
{
    rd(c);rd(n);rd(F);
    c/=2;
    inc(i,1,n)
    {
        rd(peo[i].grade);
        rd(peo[i].mon);
        L[i]=R[i]=-1;
    }
    
    sort(peo+1,peo+n+1);//按照成绩排序 
    

    int sum=0;
    inc(i,1,c)
    {
        sum+=peo[i].mon;
        q.push(peo[i].mon);
    }
    L[c+1]=sum;
    inc(i,c+1,n-c)
    {
        if(q.top()>peo[i].mon)
        {
            sum-=q.top();
            q.pop();
            q.push(peo[i].mon);
            sum+=peo[i].mon;
        } 
        L[i+1]=sum;
    }
    //从左向右扫一遍 
    
    sum=0;
    dec(i,n,n-c+1)
    {
        sum+=peo[i].mon;
        q1.push(peo[i].mon);
    }
    
    R[n-c]=sum;
    dec(i,n-c,c)
    {
        if(q1.top()>peo[i].mon)
        {
            sum-=q1.top();
            q1.pop();
            sum+=peo[i].mon;
            q1.push(peo[i].mon);
        }
        R[i-1]=sum;
    }
    //从右向左扫一遍 
    
    dec(i,n-c,c+1)
    if(R[i]+L[i]+peo[i].mon<=F)
    {
        printf("%d",peo[i].grade);
        re 0;
    }
    printf("-1");
    //计算 
    re 0;
}
原文地址:https://www.cnblogs.com/lsyyy/p/11389916.html