题目链接:http://codeforces.com/contest/913/problem/D
题目大意:给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题总数k<=ai时解决这个问题才有效,求在时限T内选择一些问题解决的最大有效问题数。n<=2*10^5,T<=10 ^ 9。

那么我们枚举解决的问题数k。那么a[i]>=k的问题我们都可以解决。当然是选择这些时间最小的k个。k减小的过程中会新添加一些可以解决的问题。但是之前的问题还是可以解决。我们用优先队列来维护这些可以解决问题就可以了。

#include<bits/stdc++.h>
#define LL long long
using namespace std;

vector<pair<int, int> > v[200005];
priority_queue<pair<int, int> > q;

int main() {
    int n, s;
    scanf("%d%d", &n, &s);
    for(int i=1; i<=n; i++){
        int a, b;
        scanf("%d%d", &a, &b);
        v[a].push_back({b, i});
    }
    LL sum=0;
    for(int i=n; i>=0; i--){
        for(int j=0; j<v[i].size(); j++){
            q.push(v[i][j]);
            sum+=v[i][j].first;
        }
        while(q.size()>i){
            sum-=q.top().first;
            q.pop();
        }
        if(q.size()==i&&sum<=s){
            printf("%d\n%d\n", q.size(), q.size());
            while(!q.empty()){
                printf("%d ", q.top().second);
                q.pop();
            }
            printf("\n");
            return 0;
        }
    }

	return 0;
}