题目描述:

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You are preparing for an exam on scheduling theory. The exam will last for exactly T milliseconds and will consist of n problems. You can either solve problem i in exactly ti milliseconds or ignore it and spend no time. You don't need time to rest after solving a problem, either.

Unfortunately, your teacher considers some of the problems too easy for you. Thus, he assigned an integer ai to every problem i meaning that the problem i can bring you a point to the final score only in case you have solved no more than ai problems overall (including problem i).

Formally, suppose you solve problems p1, p2, ..., pk during the exam. Then, your final score s will be equal to the number of values of jbetween 1 and k such that k ≤ apj.

You have guessed that the real first problem of the exam is already in front of you. Therefore, you want to choose a set of problems to solve during the exam maximizing your final score in advance. Don't forget that the exam is limited in time, and you must have enough time to solve all chosen problems. If there exist different sets of problems leading to the maximum final score, any of them will do.

Input

The first line contains two integers n and T (1 ≤ n ≤ 2·105; 1 ≤ T ≤ 109) — the number of problems in the exam and the length of the exam in milliseconds, respectively.

Each of the next n lines contains two integers ai and ti (1 ≤ ai ≤ n; 1 ≤ ti ≤ 104). The problems are numbered from 1 to n.

Output

In the first line, output a single integer s — your maximum possible final score.

In the second line, output a single integer k (0 ≤ k ≤ n) — the number of problems you should solve.

In the third line, output k distinct integers p1, p2, ..., pk (1 ≤ pi ≤ n) — the indexes of problems you should solve, in any order.

If there are several optimal sets of problems, you may output any of them.

Examples

input

5 300
    3 100
    4 150
    4 80
    2 90
    2 300

output

2
    3
    3 1 4

input

2 100
    1 787
    2 788

output

0
    0

input

2 100
    2 42
    2 58

output

2
    2
    1 2

Note

In the first example, you should solve problems 3, 1, and 4. In this case you'll spend 80 + 100 + 90 = 270 milliseconds, falling within the length of the exam, 300 milliseconds (and even leaving yourself 30 milliseconds to have a rest). Problems 3 and 1 will bring you a point each, while problem 4 won't. You'll score two points.

In the second example, the length of the exam is catastrophically not enough to solve even a single problem.

In the third example, you have just enough time to solve both problems in 42 + 58 = 100 milliseconds and hand your solutions to the teacher with a smile.

思路:

刚开始:觉得应该用贪心,但具体怎么做不清楚,只是单纯的用qsort把结构体数组先按a这个属性从小到大排序,若a相同,将时间按从大到小排序

样例1排序结果如下:

2    2  3    4  4

300  90  100  150  80

然后怎么贪心呢?先是胡思乱想,想的是从后往前,只要时间够,就加到答案里,时间不够就跳过该数,可显然不对,过了十几个样例(惊了)后终于卡住。问题出在哪?发现这个算法就是只要时间够就往上加,导致与题目的要求完全不符。那题目的意思是?

是在总时间的限制条件下,从数组中找有效元素,有效元素越多越好。有效元素就是最后找到的元素个数k要小于等于该元素的a属性值。k越大,导致对有效元素的要求越高(a要越大),最后的平衡点就是最值点。

依照上面刚开始的思路,平衡点之后可以看到在增加元素的个数是没有意义的,因为a值不会增加(已排好序)

那么该怎么做?

此处用到优先队列,类似于上面排好序的结构体数组,不过更为方便,因为是基于堆的实现。再利用二维向量,在读入数据时将a值相同的元素(ind,time)存到二维向量的一个向量中。因为题目要求分数(score)最大,i从n开始枚举,一直减少到0.

对于每个i值,代表想办法把当前情况下的分数弄到i上。将vector中的ai==i的哪一列全部加入优先队列中,再判断,如果元素多了,代表不考虑总是见的情况下,把分数弄到i是可能的。就pop出用时最大的元素,直到数量上得以满足i个有效元素;如果元素不够,说明凑不出分数为i的情况。接着判断队列中元素个数是否为i且总时间满足限制。若满足,那么分数为i的情况凑出来啦,跳出循环,可以输出答案。如果不满足,i--,看下一轮凑不凑得出分数为i的情况,直到答案或0.

知识点:priority_queue

 struct node
{
int x,y;
bool operator < (const node & a) const
{
return x<a.x;
}
};
priority_queue <node> q;
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;

代码:

 #include <iostream>
#include <vector>
#include <queue>
#define max_n 200005
using namespace std;
vector<pair<int,int> > vec[max_n];
struct node
{
int id;
int time;
friend bool operator<(node a,node b)
{
return a.time<b.time;
}
}; priority_queue<node> que;
int n;
int T;
int main()
{
cin >> n >> T;
for(int i = ;i<n;i++)
{
int num,time;
cin >> num >> time;
vec[num].push_back(pair<int,int>(time,i));
}
int sum = ;
int score = ;
for(int i = n;i>=;i--)
{
for(int j = ;j<vec[i].size();j++)
{
node p;
p.id = vec[i][j].second+;
p.time = vec[i][j].first;
que.push(p);
sum += p.time;
}
while(que.size()>i)
{
int t= que.top().time;
que.pop();
sum -= t;
}
score = i;
if(que.size()==i&&sum<=T)
{
break;
}
} cout << que.size() << endl;
cout << score << endl;
while(que.size())
{
cout << que.top().id << " ";
que.pop();
}
return ;
}

Codeforces B. Too Easy Problems的更多相关文章

  1. Codeforces 913D - Too Easy Problems

    913D - Too Easy Problems 思路:二分check k 代码: #include<bits/stdc++.h> using namespace std; #define ...

  2. 【CodeForces】913 D. Too Easy Problems

    [题目]D. Too Easy Problems [题意]给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题数k<=ai时问题有效,求在时限T内选择一些问题解决的最大有效问题数 ...

  3. 解题:AT2064 Many Easy Problems&EXNR #1 T3 两开花

    题面 两道题比较像,放在一起写了,后者可以看成前者的加强版 (sto ztb orz) 先看AT那道题 考虑计算每个点的贡献,用容斥计算:每个点没有贡献当且仅当选的所有点都在以他为根时的一个子节点的子 ...

  4. 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

    [题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...

  5. AtcoderGrandContest 005 F. Many Easy Problems

    $ >AtcoderGrandContest \space 005 F.  Many Easy Problems<$ 题目大意 : 有一棵大小为 \(n\) 的树,对于每一个 \(k \i ...

  6. codeforces 727F. Polycarp's problems

    题目链接:http://codeforces.com/contest/727/problem/F 题目大意:有n个问题,每个问题有一个价值ai,一开始的心情值为q,每当读到一个问题时,心情值将会加上该 ...

  7. 【AGC 005F】Many Easy Problems

    Description One day, Takahashi was given the following problem from Aoki: You are given a tree with ...

  8. D. Too Easy Problems

    链接 [http://codeforces.com/group/1EzrFFyOc0/contest/913/problem/D] 题意 给你n个题目,考试时间T,对于每个问题都有一个ai,以及解决所 ...

  9. AtCoder - 2064 Many Easy Problems

    Problem Statement One day, Takahashi was given the following problem from Aoki: You are given a tree ...

随机推荐

  1. SpringMVC中css,js,图片等静态资源被拦截的解决办法

    一.静态资源的存放路径 css,js,图片等静态资源存放在项目的路径必须为 二.html.jsp导入静态资源文件 html.jsp页面中的导入静态资源文件: js: css: 图片: 二.web.xm ...

  2. java 查看类是从哪个jar包加载的

    package com.jason object FIndjar { def main(args: Array[String]): Unit = { val pd = classOf[org.apac ...

  3. Java 中成员变量被局部变量所隐藏

    Java 中局部变量与成员变量同名时,局部变量会隐藏成员变量.如果我们想访问成员变量,可以使用 this 关键字. class Test { private int value = 10; void ...

  4. 后端&前端零碎知识点和注意问题

    后端 1. Spring自带的MD5加密工具类 import org.springframework.util.DigestUtils; String md5Password = DigestUtil ...

  5. Python之路【第二十篇】:python项目之旧版抽屉新热榜

    旧版抽屉新热榜 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  6. vue中引入百度地图

    xxx.vue <template> <div> <el-input v-model="inputaddr"> </el-input> ...

  7. MNIST机器学习入门(一)

    一.简介 首先介绍MNIST 数据集.如图1-1 所示, MNIST 数据集主要由一些手写数字的图片和相应的标签组成,图片一共有10 类,分别对应从0-9 ,共10 个阿拉伯数字. 原始的MNIST ...

  8. NOI2019:Stay at Home

    7.16 NOI D1 从同步赛开始更起好了 先看了一圈题目,发现T1非常可做,二次函数因为对称轴在\(x < 0\)的地方所以有跟一次函数类似的单调性,搞个单调队列维护一下似乎就可以了.大力码 ...

  9. CapsLock魔改大法——变废为宝实现高效编辑

    前言 CapsLock,也就是键盘左边中间那个大写锁定.平时很少会用到,跟shift功能重复不谈,更多的时候还会带来各种额外的麻烦. 一直以来的都是一个非常碍事讨厌的存在.就是这么一个垃圾键,偏偏却占 ...

  10. 运行一个docker镜像并开机启动

    记录,我用的liunx机是centos7.x 安装 安装Docker包$ sudo yum install docker-engine 启动Docker守护进程$ sudo service docke ...