【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

可以考虑把所有的题目按照ai排序。
然后顺序考虑最后做出来的题目个数和第i道题目的ai一样。
则1..i-1这些题目就没有用了。
值考虑i..n这些题目就可以了。
显然考虑ti最小的若干项。
使得它们的时间和我这个做法太麻烦了。。

另解1

我这种做法其实可以做得更好一点:

即枚举题目个数i从n递减到1

然后在一个集合中维护ai>=i的题目(只要枚举到第i个的时候,把ai==i的加入set里面就好了),然后保证集合的大小为i就可以了。

->如果大于k了,那么就把ti最大的那几个删掉,直到集合的大小为k

维护集合里面的题目的和就好。

另解2

二分最后的分数。

显然如果分数mid可以得到的话。

那么分数mid-1肯定也可以得到。

可以看出来有单调性。

【代码】

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N = 2e5; struct BI {
ll a[N + 10],b[N+10]; int lowbit(int x) {
return x&(-x);
} void add(int x,int y) {
while (x <= N) {
a[x] += y;
x += lowbit(x);
}
} void add2(int x,int y) {
while (x <= N) {
b[x] += y;
x += lowbit(x);
}
} ll sum(int x) {
int now = 0;
while (x > 0) {
now += a[x];
x -= lowbit(x);
}
return now;
} int sum2(int x) {
int now = 0;
while (x > 0) {
now += b[x];
x -= lowbit(x);
}
return now;
} ll get_sum(int l, int r) {
return sum(r) - sum(l - 1);
} int get_sum2(int l, int r) {
return sum2(r) - sum2(l - 1);
} }B; struct abc{
int a,t,idx;
}; bool cmp(abc a,abc b){
return a.a<b.a;
} bool cmp2(abc a,abc b){
return a.t<b.t;
} abc a[N+10],b[N+10];
int should[N+10];
multiset< int > myset;
bool bo[N+10];
int n,t; int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> t;
for (int i = 1;i <= n;i++){
cin >> a[i].a >> a[i].t;
a[i].idx = i;
}
for (int i = 1;i <= n;i++) myset.insert(a[i].t); sort(a+1,a+1+n,cmp); for (int i = 1;i <= n;i++) b[i] = a[i];
sort(b+1,b+1+n,cmp2);
for (int i = 1;i <= n;i++){
should[b[i].idx] = i;
B.add(i,b[i].t);
B.add2(i,1);
} int ans = 0,index = -1;
for (int i = 1;i <= n;i++){
int num = a[i].a;
ll now = 0;
int j = 0;
int l = 1,r = n,temp = -1,temptot;
while (l <= r){
int mid = (l+r)>>1;
int cnt = B.get_sum2(1,mid);
ll tot = B.get_sum(1,mid);
if (cnt<=num && tot<=t){
temptot = cnt;
l = mid+1;
temp = mid;
}else{
r = mid - 1;
}
} if (temp!=-1){
if (temptot>ans) {
ans = temptot;
index = i;
}
} j = i;
int tt = should[a[i].idx];
B.add2(tt,-1);
B.add(tt,-a[i].t);
bo[a[i].idx] = true;
while (j+1<=n && a[j+1].a==a[i].a) {
j++;
bo[a[j].idx] = true;
int tt = should[a[j].idx];
B.add2(tt,-1);
B.add(tt,-a[j].t);
}
i = j;
}
cout << ans << endl;
cout << ans << endl;
if (index!=-1){
sort(a+index,a+1+n,cmp2);
for (int i = index;i <= index+ans-1;i++)
cout <<a[i].idx<<' ';
}
return 0;
}

【Hello 2018 D】Too Easy Problems的更多相关文章

  1. 【AGC 005F】Many Easy Problems

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

  2. 【AGC005F】Many Easy Problems FFT 容斥原理

    题目大意 给你一棵树,有\(n\)个点.还给你了一个整数\(k\). 设\(S\)为树上某些点的集合,定义\(f(S)\)为最小的包含\(S\)的联通子图的大小. \(n\)个点选\(k\)个点一共有 ...

  3. 【AGC005F】Many Easy Problems (NTT)

    Description ​ 给你一棵\(~n~\)个点的树和一个整数\(~k~\).设为\(~S~\)为树上某些点的集合,定义\(~f(S)~\)为最小的包含\(~S~\)的联通子图的大小.\(~n~ ...

  4. 【AGC005F】Many Easy Problems

    Description 题目链接 对于每个\(k\),统计任选\(k\)个点作为关键点的"最小生成树"的大小之和 Solution 正向想法是枚举或者计算大小为\(x\).叶子数目 ...

  5. 【AGC005 F】Many Easy Problems

    神他吗一天考一道码农题两道 FFT(其实还是我推式子一窍不通) 题意 给你一棵 \(n\) 个点的树,再给你一个常数 \(k\). 设 \(S\) 为树上某些点的集合,定义 \(f(S)\) 为最小的 ...

  6. 【Hello 2018 C】Party Lemonade

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出凑够2^j最少需要花费多少钱. 即试着把第i种物品买2^(j-i)个,看看会不会更便宜 记录在huafei[0..31]中 然 ...

  7. 【Hello 2018 B】Christmas Spruce

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个dfs看看是不是每个节点都有3个叶子节点就可以了. [代码] #include <bits/stdc++.h> us ...

  8. 【Hello 2018 A】 Modular Exponentiation

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 当a<b的时候 a%b==a 显然2^n增长很快的. 当2^n>=1e8的时候,直接输出m就可以了 [代码] #incl ...

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

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

随机推荐

  1. Python学习七步走

    在周五的下午三点钟(为什么是这个时间?因为事情总会在周五下午三点钟发生),你收到一条通知,客户发现你的软件出现一个错误.在有了初步的怀疑后,你联系运维,查看你的软件日志以了解发生了什么,因为你记得收到 ...

  2. Chrome发布73 beta版:增强Linux用户体验

    Google开发者周五推动Chrome 73进入他们的测试频道,因为他们准备在3月12日左右推出这款网页浏览器更新,以便稳定推出.除非另有说明,否则下面描述的更改适用于Android,Chrome O ...

  3. 今日SGU 6.6

    sgu 177 题意:给你一个一开始全是白色的正方形,边长为n,然后问你经过几次染色之后,最后的矩形里面 还剩多少个白色的块 收获:矩形切割,我们可以这么做,离散处理,对于每次染黑的操作,看看后面有没 ...

  4. unity C# StackOverflowException

    有时候图省事,属性这样写public int pageCount{get{return pageCount;}set{pageCount=value;}}可能会报栈溢出的错误, StackOverfl ...

  5. ZooKeeper 特性

    ZooKeeper 拥有一个层次的命名空间.(like distributed)       注意:ZooKeeper 中不许使用相对路径.   一    ZooKeeper 数据模型         ...

  6. 《Java并发编程实战》第五章 同步容器类 读书笔记

    一.同步容器类 1. 同步容器类的问题 线程容器类都是线程安全的.可是当在其上进行符合操作则须要而外加锁保护其安全性. 常见符合操作包括: . 迭代 . 跳转(依据指定顺序找到当前元素的下一个元素) ...

  7. 惊叹计算机运行速度的提升---以n Queens 问题为例

    1 介绍 实现了书<Data Structures and Program design in C++>(Robert L. Kruse and Alexander J. Ryba, 20 ...

  8. Cocos2d-x学习笔记(十四)CCAutoreleasePool具体解释

    原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38964637 前言 之前学了那么多的内容.差点儿全部的控件都要涉及内存 ...

  9. Android页面事件挂接模拟

    Java没有C#的引用类型.因此事件的挂接一般都是利用接口来实现,有两种方式: 1)定义一个实现事件接口的类,然后实现接口方法,然后通过将这个类的实例加入到事件监听器里面: public class ...

  10. 设计兼容不同的屏幕尺寸的Android界面

    Android的屏幕类型有几百种不同的尺寸,从小型的手机到大型的电视机.因此要使我们的应用程序兼容不同屏幕尺寸,才可以让我们的应用提供给更多的用户使用. 一.支持不同的屏幕尺寸 1.使用"w ...