首页 > 其他分享 >MX-S5 T1~T2 题解

MX-S5 T1~T2 题解

时间:2024-11-12 15:45:07浏览次数:1  
标签:pr 优惠券 int 题解 T2 heap 物品 fi MX

MX-S5 题解

A. 王国边缘

题目链接

见到循环结构,先把下标转成从 \(0\) 开始,以方便用同余描述位置。

倍增。用二元组来表示位置:\((u, v)\) 表示第 \(u\) 个循环节的第 \(v\) 个位置。设 \(f(i, j)\) 表示从位置 \((0, i)\) 开始跳 \(2^j\) 次以后的位置。假设已经可以初始化 \(f(i, 0)\),考虑转移:

\[f(i, j)_u = f(i, j - 1)_u + f(f(i, j - 1)_v, j - 1)_u \\ f(i, j)_v = f(f(i - 1, j - 1)_v, j - 1)_v \]

下面考虑怎么计算 \(f(i, 0)\)。正难则反,设 \(pre_i\) 表示 \(i\) 之前的最近的 \(1\) 的位置(在循环意义下,并且可以是 \(i\) 本身)。这是容易 \(O(n)\) 计算的。然后我写了一个巨复杂的分讨,呃呃。反正能算。

计算答案时直接倍增。最终答案为 \(un + v + 1\)。注意二元组的第一维可以取模(且必须取模)。

int solve(i64 s, i64 t)
{
    s--;
    i64 u = s / n; int v = (int)(s % n);
    for(int i = 0; (1 << i) <= t; i++)
    {
        if(t & (1ll << i))
        {
            u = (u + f[v][i].u) % MOD;
            v = f[v][i].v;
        }
    }
    return (int)((u * n + v + 1) % MOD);
}

B. 买东西题

题目链接

学到新东西了:反悔贪心。

先把物品按原价升序排列,把优惠券按 \(w\) 升序排列。设 \(g_i\) 表示第 \(i\) 个物品使用的优惠券的编号(如果不用优惠券,那么 \(g_i = 0\),或者别的任意的东西)。考虑从前往后确定每个物品的 \(g\)。

贪心的主要问题在于局部最优解可能不是全局最优解。也就是说,如果给前 \(x\) 个物品都确定了优惠券,并且知道此时前 \(x\) 个物品的花费最小,在全局的最优解中,前 \(x\) 个物品的 \(g\) 也可能要改变。而反悔贪心解决了这个问题:即使先前确定的 \(g\) 在全局的视角中不是最优的,我们也可以“撤销”它。这样我们只要一直保持局部的最优性即可。到最后局部扩展到整体时,局部最优解就是全局最优解。

下面具体分析这个问题。

假设已经考虑到第 \(i\) 个物品。有 \(3\) 种方案来购买它:

  1. 以折扣价购买。
  2. 使用某个未被使用过的优惠券。
  3. 使用某个已经被用过的优惠券。

(显然我们不会以原价购买。)

分析第 3 种情况。首先,如果两个物品用两张优惠券,如果可以交换优惠券,总花费不会改变。所以不用考虑 \(i\) 从前面拿一张优惠券,又塞一张优惠券给前面的情况。

假设用的优惠券是 \(g_j\)。那么 \(j\) 没有优惠券了,花费从 \(a_j - v_{g_j}\) 变为 \(b_j\),而 \(i\) 的花费是 \(a_i - v_{g_j}\)。这样对总花费的影响是 \(\Delta = (a_i - v_{g_j}) + b_j - (a_j - v_{g_j}) = a_i - (a_j - b_j)\)。效果就相当于 \(i\) 用了一张减价 \(a_j - b_j\) 的优惠券。

用一个大顶堆来维护当前可用的优惠券。如果 \(i\) 用了优惠券,那么就往堆里加入一个价格为 \(a_i - b_i\) 的优惠券,以实现反悔操作。

每次确定当前物品 \(i\) 用哪张优惠券时,如果没有可用的优惠券,或者减价最多的优惠券也不如直接按折扣价买,那就按折扣价买;否则使用折扣力度最大的优惠券,并加入一张价格为 \(a_i - b_i\) 的优惠券。

sort(a.begin(), a.end()), sort(b.begin(), b.end()); // a 表示物品,b 表示优惠券
priority_queue<int> heap;
int p = 0; i64 ans = 0;
for(auto pr: a)
{
    while(p < m && pr.fi >= b[p].fi)
        heap.push(b[p++].se);
    int add;
    if(heap.empty() || pr.fi - pr.se > heap.top())
        add = pr.se;
    else
    {
        add = pr.fi - heap.top();
        heap.pop();
        heap.push(pr.fi - pr.se);
    }
    ans += add;
}

C. IMAWANOKIWA (Construction ver.)

题目链接

牛逼分讨题。拿个特殊性质的 12 分跑路就差不多得了。正赛应该不会有这种玩意吧……

D. 魔法少女们

不会计数。

标签:pr,优惠券,int,题解,T2,heap,物品,fi,MX
From: https://www.cnblogs.com/dengstar/p/18542010

相关文章

  • springboot2+mybatis+shardingsphere-5.5.1
    注意:1.druid不能boot-starter方式引入2.snakeyaml需要1.33('voidorg.yaml.snakeyaml.LoaderOptions.setCodePointLimit(int)') #303183.spring.datasource.driverClassName:org.apache.shardingsphere.driver.ShardingSphereDriver4.如果使用了quartz,需要指定独立数据源(Tabl......
  • CF 705 题解
    CF705题解AHulk模拟即可.BSpiderMan打sg表可以发现,奇数个球先手必败(sg=0),偶数先手必胜(sg=1).多个组合只要把sg值异或起来就好.CThor暴力模拟就可以了,用队列模拟.DAntMan结论:按照编号由小到大加入链表,每次尽量让答案最小贪心就是对的.若原来是......
  • 题解:洛谷 P5180 【模板】支配树
    在图论模拟赛被T4的有向图必经点硬控了\(10^9+7s\),写篇题解纪念一下。其实,求有向图的必经点,通法就是支配树。一些定义:支配点:在确定起点\(S\)的情况下,对于一个点\(k\),若存在\(x\),使得删除\(x\)以及与\(x\)连接的边后,\(x\)与\(k\),不再强连通,那么就称\(k\)为\(x......
  • 【题解】洛谷P3118: Moovie Mooving G
    洛谷P3118:MoovieMoovingG看到数据范围考虑状压,题目要求看的电影最少那就维护时间最大,我们设\(f_{i}\)为\(i\)状态最多可以看多久的电影,对于不在集合的点我们枚举转移。我们每个开始时间都对应一个截至时间,问能加入这个点,每个点花费时间是固定的,我们又要不间断所以我们找......
  • 自然语言处理:第六十章 text2vec 如何选择 chunksize 和 splitter?
    本人项目地址大全:Victor94-king/NLP__ManVictor:CSDNofManVictor项目地址:HuixiangDou/README_zh.mdatmain·InternLM/HuixiangDou写在前面:笔者更新不易,希望走过路过点个关注和赞,笔芯!!!写在前面:笔者更新不易,希望走过路过点个关注和赞,笔芯!!!写在前面:笔者......
  • CF785D 题解
    CF题目luogu题目题解似乎清一色是同一个做法,这里给一个容斥的做法。首先枚举一个位置\(i\),设\([1,i]\)的左括号个数为\(p\),\([i+1,n]\)的右括号个数为\(q\),那么以\(i\)这个位置为分界点的合法括号数有\(\sum_{i=1}^{\min(p,q)}C_p^iC_q^i\)个。通过范德蒙德卷......
  • CF 1325 题解
    CF1325题解AEhAbAnDgCd有\(\gcd(1,x)=1,\text{lcm}(1,x)=x\),因此输出\(1x\).BCopyCopyCopyCopyCopy要求严格上升子序列,那么答案的上界当然是去重后的元素个数.能否取到上界呢?当然可以,每一段内选一个你想要的就可以了.CEhabandPath-eticMEXs发现\(0,......
  • STM32+cubemx岸电绞车超速报警
    一、项目背景与概述    在当今高度自动化和智能化的时代,对电子系统的功能和性能要求不断提高。本项目旨在基于STM32微控制器开发一个岸电绞车超速报警模块,提供实时监测与控制其旋转速度,确保安全运行。该系统综合运用了嵌入式软件开发技术、硬件电路设计以及信号处......
  • 历年CSP-J初赛真题解析 | 2020年CSP-J初赛完善程序(34-43)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客(质因数分解)给出正整数n,请输出将n质因数分解的结果,结果从小到大输出。例如:输入n=120,程序应该输出22235,表示120=2×2×2×......
  • 博弈论(零和博弈)英文版题解
    翻译:   假设我们有一个两人零和游戏,每个玩家有两种行动,行收益矩阵如下:计算行和列玩家的最小最大最优策略以及游戏的价值。      X     YA    a11   a12B    a21   a22选项:1.行玩家:第一种行动的概率为三分之二,第......