[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=5343

[算法]

对于每组询问 , 首先二分答案

显然 , 最优策略为优先选择价格低的

建立可持久化线段树 , 简单维护即可

时间复杂度 : O(NlogN ^ 2)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define N 100010
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull; struct info
{
int d , p , l;
} a[N]; int n , m , len;
int b[N] , rt[N]; struct Presitent_Segment_Tree
{
int sz;
Presitent_Segment_Tree()
{
sz = ;
}
struct node
{
int lc , rc;
ll cnt , sum;
} a[N * ];
inline void build(int &now , int l , int r)
{
now = ++sz;
if (l == r) return;
int mid = (l + r) >> ;
build(a[now].lc , l , mid);
build(a[now].rc , mid + , r);
}
inline void modify(int &now , int old , int l , int r , int x , int y)
{
now = ++sz;
a[now].lc = a[old].lc , a[now].rc = a[old].rc;
a[now].cnt = a[old].cnt + y;
a[now].sum = a[old].sum + 1ll * b[x] * y;
if (l == r) return;
int mid = (l + r) >> ;
if (mid >= x) modify(a[now].lc , a[now].lc , l , mid , x , y);
else modify(a[now].rc , a[now].rc , mid + , r , x , y);
}
inline ll query(int now , int l , int r , ll x)
{
if (l == r)
return 1ll * b[l] * x;
int mid = (l + r) >> ;
if (a[a[now].lc].cnt >= x) return query(a[now].lc , l , mid , x);
else return a[a[now].lc].sum + query(a[now].rc , mid + , r , x - a[a[now].lc].cnt);
}
} PST; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline bool cmp(info a , info b)
{
return a.d > b.d;
} int main()
{ read(n); read(m);
for (int i = ; i <= n; i++)
{
read(a[i].d);
read(a[i].p);
read(a[i].l);
b[i] = a[i].p;
}
sort(b + , b + n + );
len = unique(b + , b + n + ) - b - ;
sort(a + , a + n + , cmp);
for (int i = ; i <= n; i++) a[i].p = lower_bound(b + , b + len + , a[i].p) - b;
PST.build(rt[] , , len);
for (int i = ; i <= n; i++) PST.modify(rt[i] , rt[i - ] , , len , a[i].p , a[i].l);
while (m--)
{
ll G , L;
read(G); read(L);
int l = , r = (int)1e5 , ans = ;
while (l <= r)
{
int mid = (l + r) >> ;
int ll = , rr = n , loc = ;
while (ll <= rr)
{
int md = (ll + rr) >> ;
if (a[md].d >= mid)
{
ll = md + ;
loc = md;
} else rr = md - ;
}
if (PST.a[rt[loc]].cnt >= L && PST.query(rt[loc] , , len , L) <= G)
{
l = mid + ;
ans = mid;
} else r = mid - ;
}
if (ans == ) puts("-1");
else printf("%d\n" , ans);
} return ; }

最新文章

  1. 如何优雅地使用Sublime Text
  2. Web Components初探
  3. 同上! 下拉复选框 点击当前的checkbox 选中后面li 添加到指定区域
  4. C# 创建开机启动核心代码
  5. JS获取地址栏参数
  6. wpf获取模板化控件中的动画。
  7. Queue的push和front操作
  8. MySQL与SqlServer中update操作同一个表问题
  9. 在Mac上用自己编译出的DNX运行.NET程序
  10. 还原SQLServer2008数据库报用户无法登录 .
  11. 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务(老罗学习笔记6)
  12. Poj OpenJudge 1068 Parencodings
  13. css3中的动画处理
  14. DOS批处理命令-@命令
  15. Nhibernate 一对多,多对一配置
  16. cut 命令
  17. 独立硬盘冗余阵列与HDFS
  18. 列表:一个打了激素的数组 - 零基础入门学习Python010
  19. 开始QT+OpenCV学问
  20. java面向对象中的String类中12种常用的方法

热门文章

  1. sqlalchemy如何实现时间列自动更新?
  2. 为什么硬盘明明还有空间,linux却说硬盘空间不足?inode;mkdir: 无法创建目录&quot;shen1&quot;: 设备上没有空间
  3. C++中sizeof(struct)怎么计算?(转)
  4. pascals-triangleI、II——生成规律的三角形
  5. wdatepicker ie8等问题
  6. Net is as typeof 运行运算符详解 net 自定义泛型那点事
  7. 为Redmine的项目加上起止时间
  8. 【Sprint2 每日Scrum】 第一天(4.22)Sprint2计划会议成果
  9. Sublime Text 3相关配置和设置
  10. Error: Cannot find module &#39;webpack&#39;错误解决