08年的论文里的方法看了半天觉得好奇怪
算法2各种看不懂。
然后发现算法1好像不用平衡树哎。
不如把算法1的动规改成贪心,然后用堆维护一下就好了。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int N=200000+5; typedef long long ll; struct drct{ ll c,w; bool operator<(const drct &rhs)const{ return c<rhs.c; } }d[N]; priority_queue<ll>q; int main(){ //freopen("pendant.in","r",stdin); //freopen("pendant.out","w",stdout); int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&d[i].c,&d[i].w); d[i].c+=d[i].w; } sort(d+1,d+1+n); ll tot=0; int ans=0; for(int i=1;i<=n;i++) if(d[i].c-d[i].w>=tot)q.push(d[i].w),tot+=d[i].w,ans++; else if(d[i].w<q.top())tot+=d[i].w-q.top(),q.pop(),q.push(d[i].w); printf("%d\n%lld\n",ans,tot); return 0; }