2023 ccpc 网络赛 L 题解

news2024/11/23 15:00:47

Problem L. Partially Free Meal

题面

在这里插入图片描述

官方题解

在这里插入图片描述

官方题解解读

w(k,x)计算部分

主席树常规做法,在一般主席树中多维护一个这个区间的总和就ok了

根据单调性分治求解部分

接下来我们来推导一下单调性,也就是题解中的 f ( 1 ) < = f ( 2 ) < = f ( 3 ) 接下来我们来推导一下单调性,也就是题解中的f(1) <= f(2) <= f(3) 接下来我们来推导一下单调性,也就是题解中的f(1)<=f(2)<=f(3)
比如我们 f ( 1 ) = i , 设 j < i , 那么 w ( 2 , i ) 一定小于等于 w ( 2 , j ) 比如我们f(1)=i, 设j<i, 那么w(2,i) 一定小于等于w(2,j) 比如我们f(1)=i,j<i,那么w(2,i)一定小于等于w(2,j)
因为 w ( 2 , i ) 和 w ( 2 , j ) 就相当于在 w ( 1 , i ) , w ( 1 , j ) 基础上再选一个,然而 i > j 因为w(2,i) 和 w(2,j)就相当于在w(1,i),w(1,j)基础上再选一个,然而i>j 因为w(2,i)w(2,j)就相当于在w(1,i),w(1,j)基础上再选一个,然而i>j
那么 i 可选的新的点的范围就涵盖 j 可选新的点范围了,所以 w ( 2 , i ) 不可能大于 w ( 2 , j ) 那么i可选的新的点的范围就涵盖j可选新的点范围了,所以w(2,i)不可能大于w(2,j) 那么i可选的新的点的范围就涵盖j可选新的点范围了,所以w(2,i)不可能大于w(2,j)
比如设 f ( k 1 ) = i , j < i 那么 w ( k 1 + 1 , i ) < = w ( k 1 + 1 , j ) 比如设f(k1) = i, j < i 那么 w(k1+1,i) <= w(k1+1,j) 比如设f(k1)=i,j<i那么w(k1+1,i)<=w(k1+1,j)
证明如下: w ( k 1 + 1 , i ) 是 a i + b i + i 前面最小的 k 1 个 a i 的值, w ( k 1 + 1 , j ) 是 a j + b j + j 前面最小的 k 个 a i 证明如下:w(k1+1,i)是ai+bi+i前面最小的k1个ai的值,w(k1+1,j)是aj+bj+j前面最小的k个ai 证明如下:w(k1+1,i)ai+bi+i前面最小的k1ai的值,w(k1+1,j)aj+bj+j前面最小的kai
就是在此基础上再多选一个,然而 i > j 那么 i 的选择范围涵盖了 j 就是在此基础上再多选一个,然而i>j那么i的选择范围涵盖了j 就是在此基础上再多选一个,然而i>j那么i的选择范围涵盖了j
并且 w ( k 1 , i ) < w ( k 1 , j ) 所以 w ( k 1 + 1 , i ) < = w ( k 1 + 1 , j ) 并且w(k1,i)<w(k1,j)所以 w(k1+1,i) <= w(k1+1,j) 并且w(k1,i)<w(k1,j)所以w(k1+1,i)<=w(k1+1,j)
有了 f ( 1 ) < = f ( 2 ) < = f ( 3 ) 的决策单调性结论 有了f(1)<=f(2)<=f(3)的决策单调性结论 有了f(1)<=f(2)<=f(3)的决策单调性结论
我们发现我们要求的 k 范围是 1 − n 暴力做法是针对每个 k 都跑一遍所有的 x 我们发现我们要求的k范围是1-n暴力做法是针对每个k都跑一遍所有的x 我们发现我们要求的k范围是1n暴力做法是针对每个k都跑一遍所有的x
n 方复杂度肯定不行,这时候我们发现决策单调性,也就是 f ( 2 ) 肯定在 f ( 1 ) 及它后面 n方复杂度肯定不行,这时候我们发现决策单调性,也就是f(2)肯定在f(1)及它后面 n方复杂度肯定不行,这时候我们发现决策单调性,也就是f(2)肯定在f(1)及它后面
这时候就可以根据 f ( n ) 进行分治,每次把 k 区间分两半,暴力计算出 f ( m i d k ) 这时候就可以根据f(n)进行分治, 每次把k区间分两半,暴力计算出f(mid_k) 这时候就可以根据f(n)进行分治,每次把k区间分两半,暴力计算出f(midk)
然后 m i d k 左边的区间影响决策的 x 范围也就是 1 到 f ( m i d k ) − 1 然后mid_k左边的区间影响决策的x范围也就是1到f(mid_k)-1 然后midk左边的区间影响决策的x范围也就是1f(midk)1
m i d k 右边的区间影响决策的区间就是 f ( m i d k ) + 1 到 n mid_k右边的区间影响决策的区间就是f(mid_k)+1到n midk右边的区间影响决策的区间就是f(midk)+1n
这样一共分为 l o g ( n ) 层,每层计算区间和为 n ,复杂度为 n l o g ( n ) 这样一共分为log(n)层,每层计算区间和为n,复杂度为nlog(n) 这样一共分为log(n)层,每层计算区间和为n,复杂度为nlog(n)


拟定std代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;

int root[N], idx, n;
LL ans[N];
struct PST{
	int lson, rson;
	int num; LL sum;
}tr[N<<5];

struct node{
	int a, b;
	bool operator <(node & tem){
		return b < tem.b;
	}
}res[N];

vector<int> diz;

void build(int &x, int l, int r)
{
	x = ++idx;
	if(l == r) return;
	int mid = (l+r) >> 1;
	build(tr[x].lson, l, mid);
	build(tr[x].rson, mid+1, r);
}

int find(int x)
{
	return lower_bound(diz.begin(), diz.end(), x) - diz.begin() + 1;
}

void insert(int &x, int y, int l, int r, int c)
{
	x = ++idx; tr[x] = tr[y]; tr[x].num ++; tr[x].sum += diz[c-1];
	if(l == r) return;
	int mid = (l+r) >> 1;
	if(c <= mid) insert(tr[x].lson, tr[y].lson, 1, mid, c);
	else insert(tr[x].rson, tr[y].rson, mid+1, r, c);
}

LL query(int x, int l, int r, int k)
{
	if(l == r) return 1ll*diz[l-1]*k;
	int mid = (l+r) >> 1;
	int cur = tr[tr[x].lson].num;
	if(cur <= k)
	{
		return tr[tr[x].lson].sum + query(tr[x].rson, mid+1, r, k-cur);
	}
	else return query(tr[x].lson, l, mid, k);
}

void solve(int kl, int kr, int xl, int xr)
{
	if(kl > kr) return ;
	int kmid = (kl+kr) >> 1; LL cur = 1e18; int xmid = 0;
	for(int i = max(xl, kmid); i <= xr; i ++)
	{
		if(1ll*res[i].b + res[i].a + query(root[i-1], 1, diz.size(), kmid-1) < cur)
		{
			cur = 1ll*res[i].b + res[i].a + query(root[i-1], 1, diz.size(), kmid-1); xmid = i;
		}
	}
	ans[kmid] = cur;
	solve(kl, kmid-1, xl, xmid); solve(kmid+1, kr, xmid, xr);
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0);
	cin >> n;
	for(int i = 1; i <= n; i ++){
		cin >> res[i].a >> res[i].b;
		diz.push_back(res[i].a);
	} 
	sort(res+1, res+1+n);
	sort(diz.begin(), diz.end());
	diz.erase(unique(diz.begin(), diz.end()), diz.end());
	build(root[0], 1, diz.size());
	for(int i = 1; i <= n; i ++)
	{
		insert(root[i], root[i-1], 1, diz.size(), find(res[i].a));
	}
	solve(1, n, 1, n);
	for(int i = 1; i <= n; i ++)
	{
		cout << ans[i] << endl;
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六、pikachu之目录遍历

文章目录 一、目录遍历概述二、目录遍历实战 一、目录遍历概述 在web功能设计中&#xff0c;很多时候我们会要将需要访问的文件定义成变量&#xff0c;从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时&#xff0c;便会将请求的这个文件的值&#xff08;比如文件名…

鸡肋的RDP反制

更新时间&#xff1a;2023年07月19日09:18:29 为什么叫鸡肋&#xff1a; 鸡肋者&#xff0c;食之无肉&#xff0c;弃之有味。 你说不能成吧&#xff0c;但是有成功案例&#xff0c;你说成了吧&#xff0c;要求太高&#xff0c;还要看运气的。 一句话&#xff1a;对方需要开启…

如何通过PreMaint状态监测系统发现设备故障?

在现代工业领域&#xff0c;设备故障可能导致严重的生产中断和高额维修成本。然而&#xff0c;通过新兴的技术&#xff0c;如基于状态的维修&#xff0c;我们可以更早地发现故障并采取预防措施&#xff0c;从而实现生产的连续性和成本的降低。其中&#xff0c;PreMaint状态监测…

老板电器:劲草式企业才能穿越周期

材料力学上有两个概念&#xff1a;一个是韧性&#xff0c;用来形容材料在塑性变形和破裂过程中吸收能量的能力&#xff0c;韧性越好&#xff0c;发生脆性断裂的可能性越小&#xff1b;一个是塑性&#xff0c;是材料所受外力超过其弹性限度后具有的能永久保留形变的性质。 这两…

X2000 Linux UVC

参考文档&#xff1a;\doc\开发使用说明\USB使用说明文档\设备\USB_UVC\xburst2\USB_UVC.pdf 一、内核添加USB UVC功能 1、确定所用dts文件 进入到/tools/iconfigtool/IConfigToolApp/路径下&#xff0c;执行./IConfigTool 选择config文件&#xff0c;查看kernel默认配置 配…

油烟监管云平台在油烟净化技术中的应用研究

安科瑞 华楠 摘 要&#xff1a;介绍了生活中餐饮业油烟废气的排放特点、产生过程及其对人体和环境带来的环境&#xff0c;分析了餐饮油烟组成成分的成分特性及相关的致病症状。油烟净化器仍然是目前治理餐饮油烟比较有用的方法&#xff0c;基于高压静电原理的复合型油烟净化技…

前端面试手撕编程

目录 ES6 改变this call typeof this ! function context context || window context._this this delete context._this bind&#xff1a; return _this.apply(context, [...arguments].slice(1)); 深拷贝 !arr|| arr null || typeof arr ! object arr instanceof…

正则中常见的流派及其特性

目前正则表达式主要有两大流派&#xff08;Flavor&#xff09;&#xff1a;POSIX 流派与 PCRE 流派。 1、 POSIX 流派 POSIX 规范定义了正则表达式的两种标准&#xff1a; BRE 标准&#xff08;Basic Regular Expression 基本正则表达式&#xff09;&#xff1b;ERE 标准&am…

Android获取手机已安装应用列表JAVA实现

最终效果: 设计 实现java代码: //获取包列表private List<String> getPkgList() {List<String> packages new ArrayList<String>();try {//使用命令行方式获取包列表Process p Runtime.getRuntime().exec("pm list packages");//取得命令行输出…

【微信小程序开发】一文带你详解小程序组件和 API 的使用

引言 在小程序开发中&#xff0c;组件和API是非常重要的部分&#xff0c;它们可以帮助我们构建丰富的用户界面和实现各种功能。本文将介绍小程序中常用的组件和API&#xff0c;并提供相应的代码示例。 文章目录 引言组件文本组件图片组件按钮组件输入框组件列表组件 API网络请…

C语言小练习(三)

&#x1f31e; “也许你感觉自己与周遭格格不入&#xff0c;但正是那些你一人度过的时光&#xff0c;让你变得越来越有意思&#xff0c;等有天别人终于注意到你的时候&#xff0c;他们就会发现一个比他们想象中更酷的人。”-《生活大爆炸》 Day03 &#x1f4dd; 一.选择题&…

【Vue框架】基本的login登录

前言 最近事情比较多&#xff0c;只能抽时间看了&#xff0c;放几天就把之前弄的都忘了&#xff0c;现在只挑着核心的部分看。现在铺垫了这么久&#xff0c;终于可以看前端最基本的登录了&#x1f602;。 1、views\login\index.vue 由于代码比较长&#xff0c;这里将vue和js…

vxe-table解决虚拟滚动时的白屏问题

项目中使用虚拟滚动&#xff0c;滚动一快就会白屏&#xff0c;花了两天时间看了源码&#xff0c;检查渲染元素&#xff0c;发现元素渲染的是很快的&#xff0c;跟得上的&#xff0c;但是还是会出现白屏&#xff0c;后面检查样式&#xff0c;发现只要把表格背景色去掉&#xff0…

平安私人银行慈善沙龙广州站:善财传承公益有道,广州分行聚爱同行

近年来&#xff0c;平安私人银行将慈善作为客户服务的王牌权益之一&#xff0c;激发和满足客户公益慈善心愿&#xff0c;打造财富人群和困境人群的桥梁&#xff0c;并链接公益机构等专业组织&#xff0c;深度挖掘金融赋能慈善的多种可能性&#xff0c;让财富通过慈善事业释放出…

STM32CubeMX配置STM32G0 Standby模式停止IWDG(HAL库开发)

1.打开STM32CubeMX选择好对应的芯片&#xff0c;打开IWDG 2.打开串口1进行调试 3.配置好时钟 4.写好项目名称&#xff0c;选好开发环境&#xff0c;最后获取代码。 5.打开工程&#xff0c;点击魔术棒&#xff0c;勾选Use Micro LIB 6.修改main.c #include "main.h"…

springCloud整合Zookeeper的时候调用找不到服务

SpringCloud整合Zookeeper的时候调用找不到服务 首先&#xff0c;我们在注册中心注册了这个服务&#xff1a; 然后我们使用RestTemplate 调用的时候发现失败了&#xff1a;找不到这个服务&#xff1a; 找了很多资料发现这个必须要加上负载才行 BeanLoadBalanced //负载publi…

javaee idea创建maven项目,使用el和jstl

如果使用el表达式出现下图问题 解决办法 这是因为maven创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 办法1 在每个需要用到el和jstl的页面的上面加一句: <% page isELIgnored"false" %> 方法2 修改web.xml文件开…

node和前端项目宝塔部署

首先需要一台服务器 购买渠道&#xff1a;阿里云、腾讯云、百度云、华为云 一、以阿里云为例 购买esc 可临时购买测试服务器 二、安装宝塔 复制公网ip地址 通过Xshell 进行账号密码的连接 连接后访问宝塔官网 宝塔面板下载&#xff0c;免费全能的服务器运维软件 找到自己…

jenkins Linux如何修改jenkins 默认的工作空间workspace

由于jenkins默认存放数据的目录是/var/lib/jenkins&#xff0c;一般这个var目录的磁盘空间很小的&#xff0c;就几十G,所以需要修改jenkins的默认工作空间workspace 环境 jenkins使用yum安装的 centos 7 正题 1 查看jenkins安装路径 [rootlocalhost jenkins_old_data]# rpm…

二叉树题目:二叉树的层序遍历 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的层序遍历 II 出处&#xff1a;107. 二叉树的层序遍历 II 难度 4 级 题目描述 要求 给你二叉树的根结点 root \texttt{root} root&#x…