链接:

https://codeforces.com/contest/1185/problem/C2

题意:

The only difference between easy and hard versions is constraints.

If you write a solution in Python, then prefer to send it in PyPy to speed up execution time.

A session has begun at Beland State University. Many students are taking exams.

Polygraph Poligrafovich is going to examine a group of n students. Students will take the exam one-by-one in order from 1-th to n-th. Rules of the exam are following:

The i-th student randomly chooses a ticket.

if this ticket is too hard to the student, he doesn't answer and goes home immediately (this process is so fast that it's considered no time elapses). This student fails the exam.

if the student finds the ticket easy, he spends exactly ti minutes to pass the exam. After it, he immediately gets a mark and goes home.

Students take the exam in the fixed order, one-by-one, without any interruption. At any moment of time, Polygraph Poligrafovich takes the answer from one student.

The duration of the whole exam for all students is M minutes (maxti≤M), so students at the end of the list have a greater possibility to run out of time to pass the exam.

For each student i, you should count the minimum possible number of students who need to fail the exam so the i-th student has enough time to pass the exam.

For each student i, find the answer independently. That is, if when finding the answer for the student i1 some student j should leave, then while finding the answer for i2 (i2>i1) the student j student does not have to go home.

思路:

c1和c2范围不同,就只写一个c2了

每次循环从100-1的数找有几个,优先用掉最大的就行,原本以为过不了hard版本。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
const int MAXN = 2e7 + 10;
const int MOD = 1e9 + 7;
int n, m, k, t; int Num[MAXN]; int main()
{
cin >> n >> m;
int sum = 0, v, cnt;
for (int i = 1;i <= n;i++)
{
cnt = 0;
int tmp = sum;
cin >> v;
if (m - sum < v)
{
for (int j = 100;j >= 1;j--)
{
if (m - (tmp-j*Num[j]) >= v)
{
cnt += (tmp-m+v+j-1)/j;
break;
}
tmp -= j*Num[j];
cnt += Num[j];
}
}
cout << cnt << ' ' ;
Num[v]++;
sum += v;
}
cout << endl; return 0;
}

最新文章

  1. MyBatis学习总结(一)——MyBatis快速入门
  2. servlet 之 response 回复 字节流 字符流
  3. Dashborad 上显示出错
  4. 再议C风格变量声明
  5. Python3利用BeautifulSoup4抓取站点小说全文的代码
  6. iOS中响应者链条-触摸事件
  7. CSS浏览器兼容性写法小结
  8. &quot;互联网思维&quot;背后的谎言
  9. 黄聪:Discuz!的SEO优化策略一:如何设置标题 &amp; 如何去掉Powered by Discuz!尾巴
  10. 我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)
  11. .NET性能优化方面的总结
  12. Tar打包、压缩与解压缩到指定目录的方法
  13. (Problem 49)Prime permutations
  14. WebService 之 WSDL文件 解说
  15. qt rcc 使用
  16. 触摸滑动插件 Swiper
  17. PHP 序列化/反序列化的方法函数
  18. 异步与并行~CancellationTokenSource对线程的作用
  19. 入门NodeJS
  20. Spring Cloud基础教程视频教程

热门文章

  1. java:Oracle(table的增删改查,data的增删改查)
  2. centos v7.0解决乱码
  3. 【计算机视觉】【图像处理】【VS开发】【Qt开发】opencv之深拷贝及浅拷贝,IplImage装换为Mat
  4. 纯JS实现多图片上传(在layui框架中)
  5. C# 字符串、字节数组互相转换
  6. ICPC Asia Nanning 2017 F. The Chosen One (大数、规律、2的k次幂)
  7. 【Linux 网络编程】字节序和地址装换
  8. [转帖]Ubuntu 对应内核版本
  9. 【转】mysql索引的探究
  10. Oracle 查看 impdp 正在执行的内容