首页 > 其他分享 >ABC 388 (DEG)

ABC 388 (DEG)

时间:2025-01-13 16:32:11浏览次数:1  
标签:二分 ABC 赛时 后缀 复杂度 stop num 388 DEG

赛时4题,打得很差的一场。尤其是E题,赛时一直被卡,直到结束看群友的结论后顿然醒悟,不到3分钟码出并AC,只能恨自己赛时为什么这么sb...

D

模拟 + 差分

从左到右枚举\(i\),每一次枚举可以计算出第\(i\)个人有多少颗糖(\(a[i]\) + 前面\(i-1\)个人给的糖数\(num\))。这样,第\(i\)个人会给出的糖数为:

numout = min(n - i, a[i] + num)

给后面的人糖的区间范围是\([i + 1, i + numout]\)。可以考虑设置差分数组\(stop\),其中\(stop[i]\)表示枚举到第\(i\)个人时,前面\(i-1\)个人刚刚开始停止给第\(i\)个人糖的人数。这样每次可以令\(stop[i + numout + 1]++\),用\(sumstop\)维护差分数组的前缀和,就是当前\(i-1\)个人不给第\(i\)个人糖的人数。所以上述的\(num\)便可直接计算:

num = i - 1 - sum_stop

最后每个人的糖数即为:

max(0 , a[i] + num - (n - i))

具体细节见代码

code

E

贪心 + 思维,最想抽自己的一集

只需要注意答案数量不超过\(n/2\)。这样就能得到一个关键性质:前\(n/2\)个蛋糕一定放上面,后\(n/2\)个蛋糕一定放下面。(赛时因为没想到这个而坐牢\(1h\)...)

然后就没有然后了,直接前一半与后一半贪心匹配就好了,二分\(or\)双指针均可做。

code

G

二分 + ST表 + 推公式

这道题不能延续题解中E的做法,需要换一个思路。其实E还有另一种做法:
二分答案,然后取答案作为前后缀长度,这样转化为判断前后缀是否一 一匹配(证明不难,略)。

前后缀一 一匹配在E中可以线性双指针来判断,在G中就不行了,因为要对\(q\)个子数组判断,复杂度\(O(nq)\),故需要用一种更高效的方式来判断:

预处理\(a\)数组中每个位置\(i\),满足:\(a[T[i]] >= 2 * a[i]\)的第一个位置\(T[i]\)(\(1 <= i,T[i] <= n\))。

对于询问区间\([l,r]\),设二分的前后缀长度为\(k\),则对于前缀中的某个位置\(i\)(\(l <= i <= l + k - 1\)),设在后缀中需要匹配的位置为\(pos\),则有:

r - pos = l + k - 1 - i

即\(pos = r - l - k + i + 1\)。由于需要满足\(a[pos] >= 2 * a[i]\)的性质,故:

T[i] <= pos = r - l - k + i + 1

将带\(i\)的式子移到不等式左侧,即为:

T[i] - i <= r - l - k + 1

这个不等式是对任意 \(l <= i <= l + k - 1\) 均要满足的,否则就会出现前后缀中某个位置失配的情况,而右侧为定值。故可写作:

max(T[i] - i) <= r - l - k + 1 (l <= i <= l + k - 1)

因此,若上式满足,则当前二分的前后缀匹配,可以进一步扩大正在二分的答案\(k\);若不满足,则前后缀失配,需要缩小正在二分的答案\(k\)。

可以发现左边是求区间最大值,由于无修改,故可以用ST表预处理来维护区间\(T[i]-i\)的最大值,且ST表的查询复杂度为\(O(1)\),相对于线段树可以少一个\(log\)复杂度。

总时间复杂度为\(O(qlogn + nlogn)\)

code

标签:二分,ABC,赛时,后缀,复杂度,stop,num,388,DEG
From: https://www.cnblogs.com/jjjxs/p/18666263

相关文章

  • 题解:AT_abc353_f [ABC353F] Tile Distance
    [ABC353F]TileDistance题解cnblogs题目传送门:洛谷,AtcoderSolution很恶心人的分类讨论题。很显然走大格子大概率比走小格子快。对终点和起点向上下左右枚举大格子,我们就把问题转化为给两个大格子\((a,b)\)、\((c,d)\),求怎样走最快。对角的大格子可以通过\(2\)步相互到......
  • ABC388
    好像已经很久没有写过题解了Clink对于每一个糕点,二分查找大于等于它大小的二倍的糕点的位置(可以用\(lower_{}bound\)函数),从这个位置到\(n\)就是可以和这个糕点配对的糕点。猜猜我是啥#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn;inta[......
  • ABC388DEG 题解
    ABC388题解ABCDE+G,rk371。D观察到几个性质:一个人只会在成年的时候得到石头,在成年之后给出石头。第\(i\)个人成年之后,他要给之后的每个人一个石头(除非用光了)。也就是说,假设成年时它的石头数量为\(B_i\),则最终他的石头数量为\(\max(0,B_i-(n-i))\)。因此我们只需......
  • AT_abc388_f Dangerous Sugoroku 题解
    太幽默了。显然可以用矩阵快速幂解决,矩阵里维护距离当前点\(B\)以内的所有点可不可达,转移只需分段,在区间内和不在区间内用不同的转移矩阵即可。复杂度\(O(B^3m\logn)\)。然后你就T了。此时你很急,你现在应该快点卡常来AK这场比赛而不是研究其他的做法,于是我们发现快速幂......
  • atcoder 388 b-e题
    binclude<bits/stdc++.h>usingnamespacestd;/**@brief主函数,程序入口@returnint返回值为0,表示程序正常结束*/intmain(){//输入数组长度n和天数dintn,d;cin>>n>>d;//定义一个vector,用于存储输入数据vector<pair<int,int>>a(n);//输入数组a的元......
  • Atcoder ABC388F Dangerous Sugoroku 题解 [ 蓝 ] [ 矩阵加速 ] [ 状压矩乘 ] [ 模拟
    DangerousSugoroku:赛时写了矩乘T飞了,受到sunkuangzheng大佬的启发才知道要状压矩乘。暴力矩乘思路直接像过河那样写模拟细节非常多,于是考虑像美食家一样的思路,利用矩阵分段加速。定义\(dp_i\)表示\(i\)能否到达,则有如下转移:\[dp_{i}=\bigvee_{j=i-B}^{i-A}dp_{j}\]......
  • Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
    CountArrays:一眼秒的计数题。思路显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是\(1\),就会形成一个基环树森林。那么考虑这个环上能填什么数。因为所有数都小于等于他后面的数,所以所有数都只能相等。这就启发我们在基环树上缩点之后再进行计数。那么当缩完点......
  • 题解:AT_abc388_g [ABC388G] Simultaneous Kagamimochi 2
    鉴于本题解书写时洛谷题面暂无中文翻译,为避免可能的歧义或困惑,先对本题解中的译法进行约定:(顺便吐槽音译怪)英文题面中“mochi”或日文题面中“餅”译为“饼”。英文题面中“kagamimochi”或日文题面中“鏡餅”译为“镜饼”。鉴于本题是C和E的加强版,而我懒得去写那两题的题......
  • AtCoder Beginner Contest 388 (abc388) 赛后复盘
    为什么不会E????A-B模拟即可。C每一个大麻薯可以和所有小于等于自己\(\frac12\)的麻薯结合,二分即可。时间复杂度\(O(n\logn)\)。点击查看代码#include<bits/stdc++.h>#definelllonglong#definei128__int128#definemem(a,b)memset((a),(b),sizeof(a))#def......
  • HHKB Programming Contest 2025(AtCoder Beginner Contest 388)
    A-?UPC题意:给你一个字符串,把他的第一个字符和"UPC"输出。输出即可。点击查看代码voidsolve(){std::strings;std::cin>>s;std::cout<<s[0]<<"UPC\n";}B-HeavySnake题意:n条蛇由厚度和长度,重量为厚度乘长度,问长度加上1~k时,最大的蛇的重量分别......