首页 > 其他分享 >好题记录 [集训队互测 2023] 优惠购物 题解

好题记录 [集训队互测 2023] 优惠购物 题解

时间:2024-11-12 20:41:29浏览次数:1  
标签:lfloor min 题解 好题 rfloor ge 2023 操作 ds

首先发现这个过程的限制比较多,那么考虑重新描述这个过程。

令 \(x_i\) 表示在第 \(i\) 个物品上使用了 \(x_i\) 张券,那么一组 \(x_{1\sim n}\) 就描述了一个方案。

方便起见,令 \(s_i\) 为前 i 个物品买完后剩了几张券,那么有:

  • \(s_0 = m\)
  • \(s_i = s_{i - 1} + \lfloor\frac{a_i - x_i}{c}\rfloor\)

考虑合法的 \(x_{1\sim n}\) 要满足的条件和最后的答案。

要满足的条件:

  1. \(x_i\le b_i\)
  2. \(x_i\le s_{i - 1}\)

最后的答案为 \(\sum (a_i - x_i)\),即要求最大化 \(\sum x_i\)。

先考虑所有 \(x_i = 0\) 的情况,然后考虑变化,设 \(ds_i\) 为第 \(i\) 个物品贡献的优惠券。

基于 \(ds_i\) 的变化,可以把一个物品的 \(x_i\) 的变化拆成基于 \(3\) 种操作的变化。

  1. 前 \(a_i\bmod c\) 张,此时使用优惠券不影响 \(ds_i\)
  2. 每次操作使 \(ds_i\) 减 1 并使 \(x_i\) 加 \(c\)
  3. 使 \(ds_i\) 减 1 并使 \(x_i\) 加 \([0, c - 1]\)

为了方便考虑,设 \(s'_i = s_{i - 1} - x_i\),那么条件 2 就是 \(s'_i\ge 0\)。

接下来再次考虑每种操作造成的影响。

对 \(i\) 进行操作 1/2/3 的影响分别为:

  1. 使 \(s'_{i\sim n}\) 全部减 \(1\),\(x_i\) 加 \(1\)
  2. 使 \(s'_{i}\) 减 \(c\),使 \(s'_{j > i}\) 减 \(c + 1\),使 \(x_i\) 加 \(c\)
  3. 假设使 \(x_i\) 加 \(z\),那么会使 \(s'_{i}\) 减 \(z\),使 \(s'_{j > i}\) 减 \(z + 1\)

发现:

  1. 显然操作 2 优于操作 3,且操作 1 优于其余两个(因为相同情况下影响一定完全小于其余操作)。
  2. 为了进行最多次的操作 1 可以从右往左扫一遍。
  3. 为了进行最多次的操作 2 也可以从右往左扫一遍。

那么我们考虑动态维护 \(s'_i\) 的值。令 \(t\) 为能使用的券的个数。

对于操作 1,\(t = \min(b_i, a_i\bmod c, \min\limits_{j \ge i} s'_j)\)。

对于操作 2,\(t = \min(\lfloor\frac{b_i - x_i}{c}\rfloor, \lfloor\frac{s'_{i - 1}}{c}\rfloor, \min\limits_{j \ge i}\lfloor\frac{s'_j}{c + 1}\rfloor)\times c\)。

(我的正解的操作 3 部分的代码写得很丑陋,大概看一下就行。)

对于操作 3,考虑最优策略按能使用的券的张数从大到小,那么我们可以直接暴力模拟,\(t = \min(b_i - x_i, \min(s'_{i - 1}, d_i = \min_{j\ge i} s'_{j - 1}))\)。

发现 \(d_i\) 随 \(i\) 增大而增大。那么考虑枚举前面的限制(\(b_i - x_i\)),把 \(\ge w\) 的加入,然后看一下最大的 \(i\) 的 \(d_i\),比较一下大小即可,可以用区间加,查询区间 min 线段树维护。

可以看一下暴力模拟的代码,正解用某些方式优化了其中的过程。

暴力模拟代码1
暴力模拟代码2

正解代码

标签:lfloor,min,题解,好题,rfloor,ge,2023,操作,ds
From: https://www.cnblogs.com/SkyMaths/p/18542562

相关文章

  • 【题解】洛谷P7287: 「EZEC-5」魔法
    P7287「EZEC-5」魔法感觉好题有思维,但是我没认真读题,看到样例就我以为了,他让任意一个区间满足大于\(S\)即可不是全部。我们手搓一下样例就可以发现,对于加法我们不加白不加的话肯定全部的数都加上,乘法肯定要等到加完后才开始,这些都是贪心思路。然后就是开始搭配操作了,我遇到......
  • 题解:「2017 山东一轮集训 Day7」逆序对
    LibreOJ6077前置知识:生成函数、组合数先考虑平方怎么做。\(f_{i,j}\)表示处理了前\(i\)个值,逆序对有\(j\)个。显然可以转移到\(f_{i+1,j},f_{i+1,j+1},f_{i+1,j+2},...,f_{i+1,j+i}\)。然后发现这个东西是个很简单的递推,而且长得很生成函数,于是可以很自然的写成\[1\t......
  • 题解:[SCOI2016] 美味
    前置知识:可持久化线段树(主席树)洛谷3293[SCOI2016]美味问题有一个长度为\(n\)的序列\(a_1,a_2,...,a_n\)。每次询问给你\(b\)、\(x\),你需要求出\(\max\{a_i+x\bigoplusb\}\)。\(1\lel\ler\len\le2\times10^5,0\lea_i,b,x<10^5\)首先,有\(l,r\)应该......
  • AtCoder Beginner Contest 378 题解
    AtCoderBeginnerContest378题解比赛链接A-Pairing贪心#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidShowball(){vector<int>a(5);for(inti=0;i<4;i++){intx;cin>>x;a[x]++;......
  • 【数据分享】2000-2023年我国1km分辨率的逐日O3栅格数据
    空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2023年全国范围逐日的PM2.5栅格数据、2013-2023年全国范围逐日SO2栅格数据、2000-2023年全国范围逐日PM10栅格数据(均可查看之前的文章获悉详情)!本次我们给大家带来的是2000-2023年全国范围的逐日的O3栅......
  • 题解:[XIX Open Cup, Grand Prix of Korea] Dev, Please Add This!
    前置知识:2-SAT题意[XIXOpenCup,GrandPrixofKorea]Dev,PleaseAddThis!在一张网格上有以下几种物品:空地(.)墙(#)星星(*)一个球(O)现在你要玩一个游戏。你可以让球朝上下左右某一个方向移动,但是一旦移动就必须走到底,也就是说直到前面是墙或者边界才能停。另外,如果你走......
  • 【题解】洛谷P7286:「EZEC-5」人赢
    P7286「EZEC-5」人赢可以想到对于每个数要找到比他大的数中下标最大的数,我们按照数的大小排序,我们维护原序列的一个指针,对于每个数如果比指针大那么就左移指针,可以思考下为什么:指针上的数比现在这个数要小那比后面的数都小,于是我们左移指针直到大于这个数,可以发现我们也在一直......
  • 【题解】洛谷P8346:最澄澈的空与海
    【题解】洛谷P8346:最澄澈的空与海猜结论题,本身其实很简单,在纸上画个差不多就能想出来,我一开始想二分图最大匹配,但是还是太大了,不可以。当一个二分图有且仅有一种解时,必定有节点的入度为\(1\)。我们想到有多种匹配的情况,可以想到如果这是一个环的情况,一个左边的点将他右边的点......
  • MX-S5 T1~T2 题解
    MX-S5题解A.王国边缘题目链接见到循环结构,先把下标转成从\(0\)开始,以方便用同余描述位置。倍增。用二元组来表示位置:\((u,v)\)表示第\(u\)个循环节的第\(v\)个位置。设\(f(i,j)\)表示从位置\((0,i)\)开始跳\(2^j\)次以后的位置。假设已经可以初始化\(f(i,......
  • CF 705 题解
    CF705题解AHulk模拟即可.BSpiderMan打sg表可以发现,奇数个球先手必败(sg=0),偶数先手必胜(sg=1).多个组合只要把sg值异或起来就好.CThor暴力模拟就可以了,用队列模拟.DAntMan结论:按照编号由小到大加入链表,每次尽量让答案最小贪心就是对的.若原来是......