AtCoder做题记录

1|0AtCoder做题记录

1|0[ARC082F] Sandglass

题意:有一个沙漏,每秒会有1g沙子从上面落下来,有k个时刻r1,r2rk,每到ri沙漏就会翻转,多次询问如果一开始上部有aig沙子,在时刻ti时上部有多少沙子。

思路:一开始的思路是每个操作形如xmax(xΔr,0),可以按时间轴用线段树维护答案,没想到这题竟然可以做到线性。

其实线性做法的思路也是维护如果一开始是多少此时就有多少,记为fi,那么可以把fi的图像画出来,发现就像这样img最终值不和上下界(红线)相等的fi必然满足在一个区间内,因此我们只用这个区间的左右端点维护上下界即可做到线性。

1|0[AGC027D] Modulo Matrix

题意:构造一个n×n的矩阵,要求满足:每个元素不超过1015且互不相同,对于任意两个相邻的数(x,y)max(x,y)modmin(x,y)必须相等。

思路:我也不知道这么人类智慧的做法是怎么想出来的。首先,把这个矩阵黑白染色,钦定白格子的数是所有相邻的数的lcm+1,那么可以很好的满足后两个条件。接着考虑用质数来填上面的数,不过这样做要用O(N2)个质数,白格子的数可能超出范围,于是就要想办法用尽量少的质数来完成这件事。考虑这样一种构造,给每条黑格子所在的对角线分配一个质数,这个黑格子的数就是这两个质数的乘积,再简单调整一下顺序,这样就可以保证数字大小不超过1015

1|0[AT_code_festival_2017_quala_d] Four Coloring

题意:给一个n×m的网格,有4种颜色,要给每个点染色,要求网格上任意一对曼哈顿距离为d的格子的颜色不同。

思路:这道题要用到一个小trick:曼哈顿距离转切比雪夫距离,其实本质就是把一个斜着的正方形变成了正着的,这样就更方便处理。于是就可以把网格分成d×d的一个个小网格,每个网格里染同一种颜色,每2×2的大网格按RYGB(其实可以随意)染色即可。

1|0[ARC082E] ConvexScore

题意:给定平面上n个点,定义一个点集大小为|S|的凸包的权值是:记所有在这个凸包内部和边界上的点的个数为k,则价值为2k|S|,求所有有面积的凸包的权值和。

思路:考虑组合意义。2n|S|表示的其实是所有能组成和这个凸包一样的凸包的点集个数,于是答案就是所有能组成凸包的点集个数。答案可以用所有点集个数2n减去所有不能构成凸包的点集个数,求法可以直接枚举两个点然后暴力判断有多少个点在线段上,再减去对应贡献。复杂度O(n3)

1|0[AGC003E] Sequential operations on Sequence

题意:有一个数组,初始是1n,有Q次操作,每次操作会把数组长度变成ai,新增的数是上一次操作后数组的重复,求最终数组中1n每个数出现了多少次。

思路:首先,如果上一次操作的长度比这一次要长,那么上一次操作是没用的,这一步可以用单调栈维护,于是最终会留下一个递增的操作序列。接着我们考虑倒推,第i次操作后一定是上一次操作后的序列完整重复若干次,再加上一段长为aimodai1的前缀,那么这个前缀怎么处理呢?我们再往前看,如果之前存在j使得aj1<daj,那么这个前缀也一定是aj1重复若干次再加上一段长为dmodaj1的前缀,于是可以递归处理,最终d=0是要对当前段区间加,差分一下即可。复杂度的话,每次取模d至少减半,这一步是O(logn)的,而二分查找也是一只log,于是复杂度是O(log2)的。

1|0[AGC016D] XOR Replace

题意:给定序列ab,每次可以把a序列的一个数变成a序列的异或和,求把a变成b的最少的操作次数。

思路:发现第一次把一个数ai变成异或和S后,此时的异或和是ai,因此每次操作相当于是把一个数变成上次被操作的数。简化一下,就相当于把异或和当做第n+1个数,每个操作可以把一个数和最后一个数交换。首先可以简单判断是否有解。接着考虑怎样让操作次数最小。发现这很类似排列的置换问题,于是考虑没对不同的ai,bi,让aibi连边,最终答案即为边数+联通块数-1。证明很简单,因为在同一连通块内可以用边数次完成,而从一个连通块到另一个连通块要花1的代价,一开始就在的连通块不同花这1的代价。复杂度O(nlogn)

1|0[AGC016E] Poor Turkeys

题意:有n只鸡和m个人,每个人一次操作,每个操作会选择两只鸡x,y,如果两只都活着,那么会等概率吃掉一只,如果一只还活着就吃掉这一只,否则什么都不做,求有多少对(i,j)满足在最终时刻第i只鸡和第j只鸡可能都还活着。

思路:设集合f[i]表示如果最终i活下来了,那么哪些j不能活着。如果一个人选的是(i,x),那么如果要让i活下来,x就必须死,且在之前必须活着。于是考虑倒推,对于当前的(x,y),如果x,yf[i],那么i最终肯定不能活下来,否则如果xf[i]或者yf[i],那么剩下的一个也得加入进f[i]中。统计答案时,如果f[i]f[j]无交,那么这一对就有可能都活下来。复杂度O(nm+n3w)


__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/17434900.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示