[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; }