首页 > 其他分享 >GDKOI 选做

GDKOI 选做

时间:2024-02-03 15:45:11浏览次数:17  
标签:geq 选做 一个 sum 陀螺 集合 GDKOI 我们

不休陀螺

题目描述

这里

思路点拨

考虑一个区间在什么情况下是“陀螺无限”的。一个最为简单的条件就是 \(\sum_{i=l}^r b_i-a_i \geq 0\) 。因为如果不满足这个,\(E\) 就会一直减少,就会在某一个时刻停下来。

当然,还有别的条件,比如说在中途某一个时刻 \(E+\sum_{i=l}^{mid}b_i-a_i <a_{mid+1}\) ,然后就无法继续打下去了。这个时候我们对于 \(b_i-a_i\) 是否非负展开两类讨论。

  • \(b_i-a_i \geq 0\)

我们可以在某一个排列中,让 \(i\) 之前一直安排 \(b_j-a_j<0\) 的元素,这个时候 \(E\) 就会达到最小,进而可能发生无法继续下去。令 \(sum=\sum_{i=l}^r (b_i-a_i)[b_i-a_i<0]\) ,则 $\forall i \in [l,r] $ ,若 \(b_i-a_i \geq 0\) ,则需要满足 \(E \geq a_i-sum\) 。

  • \(b_i-a_i <0\)

同理,我们希望在 \(i\) 之前一直安排 \(b_j-a_j<0\) 的元素,只不过不可以安排它自己了。需要满足:

\[E+sum-(b_i-a_i)\geq a_i \]

也就是 \(E \geq b_i-sum\) 。

现在我们以及知道了一个区间在什么情况下是合法的了。但是需要计数需要我们注意到一些性质。假设存在 \(L<l \leqslant r<R\) ,如果 \([L,R]\) 满足陀螺不休,那么 \([l,r]\) 也会满足;如果 \([l,r]\) 不满足陀螺不休,那么 \([L,R]\) 也不满足。证明是简单的。

下文暂时不考虑 \(\sum b_i-a_i \geq 0\) 的限制。
我们考虑对于某一个固定的左端点 \(l\) ,找到一个右端点 \(r_l\) 满足 \([l,r_l]\) 是陀螺不休的并且 \(r_l\) 尽量大。我们知道上述性质,则在 \(l\) 不断变大的时候 \(r_l\) 不会变小。这样子我们可以双指针。

问题转化为现在维护了一个集合,如何加入一个元素然后判断是否合法。我们考虑维护一个集合 \(S\) ,并且维护集合的 \(sum\) (定义和之前是一样的),每一次加入集合的时候就更新 \(sum\) 。并且根据 \(b_i-a_i\) 是否非负决定加入 \(a_i\) 还是 \(b_i\) 到集合 \(S\) 里面。这个区间合法就是 \(S\) 的最大值减去 \(sum\) 的值是否小于等于 \(E\) 。集合可以使用 STL_set。

现在如果我们以及求出了 \(l,r_l\) 还需要满足 \(\sum b_i-a_i \geq 0\) 的约束。记前缀和 \(sum_i=\sum_{1 \leqslant j \leqslant i}b_j-a_j\) ,也就是对于区间 \([l,r_l]\) 存在多少个 \(sum_i \geq sum_{l-1}\) 。这个可以使用线段树之类的维护,因为值域太大,但是动态开点线段树开不下这么大空间所以使用了平衡树实现。

时间复杂度 \(O(n \log n)\) 。

实现细节:本题时间比较紧,无旋treap过不了。建议使用更加快速的平衡如例如 \(\text{WBLT}\) 实现。

标签:geq,选做,一个,sum,陀螺,集合,GDKOI,我们
From: https://www.cnblogs.com/Diavolo/p/18004830

相关文章

  • [GDKOI2023]错排
    [GDKOI2023提高组]错排题目描述小X最近学习了错排问题,于是开始思考一个关于它的变种问题:有多少个长度为\(n\)的排列\(p\),满足对于\(i\lem\)的位置满足\(p_i>m\),且对于所有位置\(i\)都满足\(p_i\nei\)?小X一共想出了\(T\)个这样的问题,你能告诉他每个问题......
  • P10083 [GDKOI2024 提高组] 不休陀螺
    前置题目:石头剪刀布大赛很经典的问题,可以参考一个比这个简单容易想的*2500的做法。先想判定条件再考虑怎么计数。因为少写了一个case导致Au\(\to\)Ag,有点难评。不难想到记录\(c_i=b_i-a_i\)。我们考虑怎样才能无限下去:卡牌打完之后的费用变化是正的,不然会一直......
  • P10073 [GDKOI2024 普及组] 刷野 II 的题解
    P10073[GDKOI2024普及组]刷野II的题解谨以此篇题解记录我考场上唯一通过的一题~解题思路可以考虑定义两个指针x和y,分别为左侧攻击到哪里和右侧。此时,从两侧线性想中间递推,若先打左边的代价小就打左边的,否则就打右边的。按照这个方法向中间推就可以了。Code#include<......
  • GDKOI 2024 题解
    鸽了一些题。匹配先抽出来一个完美匹配,然后尝试调整。调整相当于:找一个偶环,满足匹配的边和未匹配的边交错,且偶环的总异或和为\(0\),是不是写个暴力就好了?发现冲过去了,很牛逼,复杂度\(O(n^3)\)(?),Code。不休陀螺一个区间可以被打出的条件是:令\(\Delta_i=b_i-a_i\),则\(x=\sum......
  • ZJOI 杂题选做
    P2272[ZJOI2007]最大半连通子图题目传送门注意到半联通子图缩完点一定是一条链,由于要求的是最大的半联通子图,所以该子图的每个强连通分量一定对应原图的完整的强连通分量,否则可以扩展。则对原图缩点,最大半联通子图一定是从入度为0的点到出度为0的点的一条链,拓扑求出带权......
  • 20211327 信息安全系统设计与实现 阅读习惯2(选做)
    阅读习惯2(选做)提交微信读书(或其他平台)目前的读书数据(总时长,册数,笔记数等)的截图,或其他阅读计划总结本学期的收获,新增的总时长,册数笔记等,谈谈本学期收获,养成良好的阅读习惯了吗?会一直坚持阅读吗?读书数据*从开始阅读电子书以来,我一直习惯于使用华为阅读app平台,在这里提交华为......
  • keepass口令管理实践(选做)20231405
    keepass口令管理实践(选做)任务详情个人隐私泄露,信息安全是一个大问题,参考https://post.smzdm.com/p/713042/,https://post.smzdm.com/p/713042/学习使用keepass保护自己的口令,提交实践截图。作业内容1.下载keepass官方版和中文的语言包2.将中文语言包存放在KeePassPasswordS......
  • Wireshark 实践(选做)
    Wireshark实践(选做)参考https://www.cnblogs.com/mq0036/p/11187138.html,访问一个网站,抓包分析一次TCP三次握手,四次分手的过程。TCP三次握手过程:客户端向服务器发送一个带有SYN(同步)标志位的数据包,请求建立连接。服务器收到请求后,返回一个带有SYN和ACK(确认)标志位的数据包,表示......
  • 7-13(选做) 装箱问题
    7-13(选做)装箱问题本题思路解释思路设置两个数组a和b,数组a存的是n项物品的大小,数组b存的是第n个物品被放在哪个大小为100的箱子中。首先,将大小为60的物品放到第一个箱子当中。然后,检查有哪个在它之前的物品能和它放在一起。如果有,那么就将其放在一起,如果没有,就将其放到......
  • 小学四则运算编程实践(选做)
    从《构建之法》第一章的“程序”例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行“软件”,满足以下需求:(以下参考博客链接:http://www.cnblogs.com/jiel/p/4810756.html)include<stdio.h>include<stdlib.h>include<time.h>voidgenerate_arithmetic......