2023NOIP A层联测20 T3 点餐
2023NOIP A层联测20 点餐
题目很好,可惜考试没想到。
思路
可以按照 \(b\) 从小到大排序,固定选择个数 \(k\),枚举选择的盘子 \(x\) 的 \(b\) 最大,最优解肯定是贪心的在前 \(x-1\) 个盘子里选择 \(k-1\) 个最小的,使用权值主席树可以在 \(O(\log_2n)\) 的时间内求解。
我们令 \(f(k)\) 表示 \(k\) 的最优解决策点 \(x\)。设 \(w(k,x)\) 当 \(k\) 的决策点为 \(x\) 时的最优答案。对于两个不同的决策 \(x,y\ (x<y)\),若有 \(w(k,x)>w(k,y)\) ,那么 \(k\) 增大后 \(x\) 可以新选的 \(a\) 值一定严格包含在 \(y\) 可以新选的 \(a\) 值以内,即 \(w(k',x)\geq w(k',y)\) 对于 \(k\leq k'\leq n\) 恒成立,所以有 \(f(k)\leq f(k')\ (k\leq k')\)。由此可得 \(f(1)\leq f(2) \leq f(3) \leq \cdots \leq f(n)\)。决策点具有单调性,可以分治求解(每次选一个区间的中点暴力求,将终点分为两半继续求,具体实现见代码)。
由于分治每一层最多跑 \(O(n)\),有 \(O(\log_2 n)\) 层,所以要求 \(O(n\log_2 n)\) 次 \(w(k,i)\),求一次 \(w(k,i)\) 要 \(O(\log_2 n)\),时间复杂度为 \(O(n\log_2^2 n)\)。
CODE
#include<bits/stdc++.h>
using namespace std;
#define inf 2e9
#define int long long
const int maxn=2e5+5;
struct node
{
int ls,rs,sz,sum;
}tree[maxn*50];
struct node1
{
int a,b;
}food[maxn];
int n,tot;
int ans[maxn],rt[maxn];
bool cmp(node1 a,node1 b){return a.b<b.b;}
void insert(int &p,int x,int l,int r)
{
tree[++tot]=tree[p];
p=tot;
if(l==r)
{
tree[p].sum+=x-1;
tree[p].sz++;
return ;
}
int mid=l+r>>1;
if(x<=mid) insert(tree[p].ls,x,l,mid);
else insert(tree[p].rs,x,mid+1,r);
tree[p].sum=tree[ tree[p].ls ].sum+tree[ tree[p].rs ].sum;
tree[p].sz=tree[ tree[p].ls ].sz+tree[ tree[p].rs ].sz;
}
int getsum(int p,int l,int r,int k)
{
if(l==r) return (l-1)*k;
int mid=l+r>>1;
if(tree[tree[p].ls].sz>=k) return getsum(tree[p].ls,l,mid,k);
else return getsum(tree[p].rs,mid+1,r,k-tree[tree[p].ls].sz)+tree[tree[p].ls].sum;
}
void solve(int l,int r,int lp,int rp)//[l,r] 的个数区间,对于 [lp,rp] 决策区间的点
{
if(r<l) return ;
int mid=l+r>>1,pos=0;
for(int i=max(lp,mid);i<=rp;i++)
{
int now=food[i].b+food[i].a+getsum(rt[i-1],1,inf,mid-1);//求 w(mid,i)
if(ans[mid]>=now)
{
ans[mid]=now;
pos=i;
}
}
solve(l,mid-1,lp,pos);//分析 f 的分布可以得出
solve(mid+1,r,pos,rp);
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld%lld",&food[i].a,&food[i].b);
sort(food+1,food+n+1,cmp);
for(int i=1;i<=n;i++)
insert(rt[i]=rt[i-1],food[i].a+1,1,inf);
memset(ans,0x5f,sizeof(ans));
solve(1,n,1,n);
for(int i=1;i<=n;i++) printf("%lld\n",ans[i]);
}
2023NOIP A层联测20 T3 点餐的更多相关文章
- 汕头市队赛SRM 20 T3 灵魂觉醒
背景 自从芽衣.布洛妮娅相继灵魂觉醒之后,琪亚娜坐不住了.自己可是第一个入驻休伯利安号的啊!于是她打算去找德丽莎帮忙,为她安排了灵魂觉醒的相关课程. 第一天,第一节课. “实现灵魂觉醒之前,你需要先将 ...
- CEOI 2019 Day2 T2 魔法树 Magic Tree (LOJ#3166、CF1993B、and JOI2021 3.20 T3) (启发式合并平衡树,线段树合并)
前言 已经是第三次遇到原题. 第一次是在 J O I 2021 S p r i n g C a m p \rm JOI2021~Spring~Camp JOI2021 Spring Camp 里遇到的 ...
- [转]oracle分页用两层循环还是三层循环?
select t2.* from --两层嵌套 (select t.* , rownum as row_numfrom t where rownum <=20) t2 where t2.row_ ...
- Python数据分析之Pandas操作大全
从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...
- Block解析(iOS)
1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...
- 很强大的HTML+CSS+JS面试题(附带答案)
一.单项选择(165题) 1.HTML是什么意思? A)高级文本语言 B)超文本标记语言 C)扩展标记语言 D)图形化标记语言 2.浏览器针对于HTML文档起到了什么作用? A)浏览器用于创建HTML ...
- MySQL Nested-Loop Join算法学习
不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天 ...
- sprint one
产品backlog Id Name Imp Est How to demo 1 各个角色账号登录功能 30 20 建立数据库,数据库中存储一些角色的初始账号以便测试,输入账号密码,系统在数据库中查找账 ...
- block的解析
1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...
- Objective-C中的Block
1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解. 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内 ...
随机推荐
- freertos学习笔记(十一)直接任务通知
直接任务通知 起源 队列和信号量是实时操作系统的典型功能,而FreeRTOS提供的直接任务通知比队列和信号量更小且速度更快(快45%) 开发人员应优先使用量身定制的功能:直接任务通知.消息缓冲区和流缓 ...
- python pyqt6 QMainWindow 使用QComboBox 窗口移位
QMainWindow 可拖拽移动,但是点击QComboBox 时,窗口有时会误识别为拖拽移动,导致窗口自动移动位置 在QMainWindow中,新增事件筛选器 # 避免点击QComboBox时,窗 ...
- Splay/LCT 学习笔记
唔,其实我不会 Splay,但是我会 LCT. 众所周知,会 LCT 和会 Splay 是两回事,因为 LCT 只需要旋至根即可. 到现在还是不会,但是先把 LCT 的 Splay 写一下吧. 自己复 ...
- 科技助力上亿用户隐私安全保护,合合信息两款产品再获CCIA PIA星级标识
随着互联网技术的飞速发展,个人信息的收集.存储.使用和传输变得日益频繁,其泄露和滥用的风险也随之增加,个人信息保护已成为社会共同关注的热点议题.近期,"中国网络安全产业联盟(CCIA)数据安 ...
- C# 基础 – 装箱 / 拆箱, 堆 / 栈
前言 有些概念可能你用不到, 但是懂也无妨. 装箱 / 拆箱 参考: C#装箱和拆箱(Boxing 和 UnBoxing) 通常讲到这些都跟性能有关. 把值类型变成引用类型就叫装箱. int numb ...
- OData – How It Work
前言 OData 是很冷门的东西, 用的人少, 开发的人少, 文档自然也少的可怜. 如果真的想用它, 多少要对它机制有点了解. 这样遇到 bug, 想扩展的时候才不至于完全没有路. 主要参考: ODa ...
- 【HFSS】HFSS绘制梯形走线的5种方法
使用HFSS仿真PCB走线,需要对走线进行建模,但是由于PCB制造过程中的蚀刻导致走线截面不是理想的矩形,而是接近梯形.为了使仿真尽量精确,需要将PCB走线截面绘制成梯形.下面介绍几种绘制梯形走线的方 ...
- C# 裁剪PDF页面
在处理PDF文档时,有时需要精确地裁剪页面以适应特定需求,比如去除广告.背景信息或者仅仅是为了简化文档内容.本文将介绍如何使用免费.NET控件通过C#实现裁剪PDF页面. 免费库 Free Spire ...
- RDK X5首发上手体验!真的太帅啦!!!
RDK X5首发上手体验!真的太帅啦!!! 本Blog同步发表于: 地瓜机器人开发者论坛: CSDN: 一年多以前无意中了解到了RDK X3,之后我便迅速的被地平线机器人开发者论坛(现在改名为了地瓜机 ...
- 2024年常用的Net web框架
ASP.NET Core 框架声明:是微软推出的新一代开源.跨平台的 Web 应用框架,用于构建高性能.现代化的 Web 应用程序. 官网地址:https://dotnet.microsoft.com ...