[CTSC 2018] 混合果汁
2024-10-21 14:22:00
[题目链接]
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 ; }
最新文章
- 如何优雅地使用Sublime Text
- Web Components初探
- 同上! 下拉复选框 点击当前的checkbox 选中后面li 添加到指定区域
- C# 创建开机启动核心代码
- JS获取地址栏参数
- wpf获取模板化控件中的动画。
- Queue的push和front操作
- MySQL与SqlServer中update操作同一个表问题
- 在Mac上用自己编译出的DNX运行.NET程序
- 还原SQLServer2008数据库报用户无法登录 .
- 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务(老罗学习笔记6)
- Poj OpenJudge 1068 Parencodings
- css3中的动画处理
- DOS批处理命令-@命令
- Nhibernate 一对多,多对一配置
- cut 命令
- 独立硬盘冗余阵列与HDFS
- 列表:一个打了激素的数组 - 零基础入门学习Python010
- 开始QT+OpenCV学问
- java面向对象中的String类中12种常用的方法
热门文章
- sqlalchemy如何实现时间列自动更新?
- 为什么硬盘明明还有空间,linux却说硬盘空间不足?inode;mkdir: 无法创建目录";shen1";: 设备上没有空间
- C++中sizeof(struct)怎么计算?(转)
- pascals-triangleI、II——生成规律的三角形
- wdatepicker ie8等问题
- Net is as typeof 运行运算符详解 net 自定义泛型那点事
- 为Redmine的项目加上起止时间
- 【Sprint2 每日Scrum】 第一天(4.22)Sprint2计划会议成果
- Sublime Text 3相关配置和设置
- Error: Cannot find module &#39;webpack&#39;错误解决