首页 > 其他分享 >AtCoder Grand Contests 杂做

AtCoder Grand Contests 杂做

时间:2024-11-16 16:45:31浏览次数:1  
标签:AtCoder log 奇数 复杂度 mathcal 考虑 Contests 可以 杂做

感觉 AGC003 及以前的题做了大部分,所以从 AGC004 开始,选一些我觉得合适的题做。


AGC004E - *3200

一直在往静态的几何(或者代数)限制想,结果没想到可以动态规划。

为了更加直观可以看作出口在移动,然后到过的点加分,某些出界的点就被 ban 掉了。我们可以直接考虑定义 \(f_{l,r,u,d}\) 表示往四个方向扩展的最大距离的最大分数。很容易发现只记录四个方向的最大距离就可以表示了。转移也很简单,尝试往四个方向扩展一个单位距离就可以了。时间复杂度是 \(\mathcal O(n^2m^2)\) 的。

AGC005D - *2900

简单题,容斥一下,发现可以根据模 \(k\) 的值分类进行动态规划,记录一下相邻位置选的状态即可。时间复杂度是 \(\mathcal O(n^2)\) 的。

AGC005E - *3300

博弈还是会不了一点啊。考虑如果先手在一条边上来回晃荡,而在蓝树上这条边的两个点的距离大于 \(2\),那么游戏将会永远进行下去。同时就可以知道在到达这样的局面之前走的每一条边在蓝树上距离只能是 \(1\) 或 \(2\)。两棵树分别以起点建有根树,就可以知道哪些点是先手不可能去到的,就在剩下的点里去看,做法也很单一。时间复杂度是线性的,只需要遍历两棵树就可以了。感觉还是很神奇。

AGC005F - *3400

其实是简单题,难点是不是在于识别出模数是 NTT 模数?我们可以拆贡献,每个点有很显然的容斥。答案就可以写成 \(\sum\limits_{x=1}^n a_x\dbinom{x}{i}\),其中 \(a\) 数组也是容易得到的。故时间复杂度就是 \(\mathcal O(n)\) 次多项式做 NTT 的复杂度。

AGC006C - *3000

我们很容易推出单次操作后 \(E(x)\) 的变化,即 \(E(x)=E(x-1)+E(x+1)-E(x)\),但是这似乎并不是特别好做。但是由方差(虽然这题还没补),我们可以知道这个变化,实际就是交换 \(x\) 和 \(x+1\) 的差分数组。然后就是求 \(k\) 轮操作过后某个点的差分被交换到了哪里。暴力求出单轮操作的结果后,倍增求即可。时间复杂度是 \(\mathcal O(n\log k)\) 的。但是实际上就是若干个置换环,所以可以直接线性。

AGC006D - *3100

见过二分的 trick 就很简单了。手玩发现长度不为 \(1\) 的连续颜色段可以一直保留,并往两边的的单独段扩展。那么过程分析得很简单了,直接模拟即可。时间复杂度是 \(\mathcal O(n\log n)\) 的。

AGC006E - *3100

可以抽象为 \(n\) 个数,每个数有黑白两种的情况。判掉一些不合法的情况。我们发现,把数字(不包括颜色)归位后,对于奇数或偶数位置,颜色异常的位置只能有偶数个。然后我们对于任意排列要交换若干次变成有序的,就要经历逆序对次,这会对另一种奇偶性颜色异常的位置奇偶性造成改变。所以还要知道奇偶位置的逆序对数的奇偶性。这可以树状数组。更厉害的方法是将逆序对数与置换环联系起来,这样就是 \(\mathcal O(n)\) 的了。

AGC006F - *3500

感觉还是对我来说有一点困难了。我们考虑把点 \((x,y)\) 转化为 \(x\) 向 \(y\) 连的一条边。对一个弱连通块,我们考虑对其染色,红连向蓝,蓝连向绿,绿连向红。如果能够完成染色,再讨论:如果不足 \(3\) 种颜色,则不会有任何额外的边,否则任何红连蓝,蓝连绿,绿连红的边都是可以得到的。如果不能完成染色,则可以证明任意两点之间的边都能得到。则可以线性简单解决这个问题。

AGC007C - *3400

会不了一点,并且感觉考不了一点。最后式子很好算,有点抽象。关键点在于考虑一个点进洞后每个点的位置期望还是等差数列。

AGC007D - *2800

很简单,考虑从走的路线一定是分成若干段,每一段形如“右,左,(等待),右”,直接分类讨论简单动态规划就可以了。我写的 \(\mathcal O(n\log n)\) 的做法,不知道有没有线性的写法。

AGC007E - *3900

套路考虑二分,显然是探完一个子树再探另一个。那么我们就可以记录 \(f_{x,y}\) 表示从子树内深度为 \(x\) 的某个点开始,以某个深度为 \(y\) 的点结尾可不可行,转移很简单。发现我们只需要对于每个 \(x\) 记录 \(g_x\) 满足 \(f_{x,y}=1\) 的最小 \(y\)。然后转移就可以用双指针来做。把每个点的所有状态暴力记录下来,并只保留成随 \(x\) 增加,\(g_x\) 减少的一部分。状态数是 \(\mathcal O(n\log n)\) 的,可以用树上启发式合并那一套证明。粗略实现是三只 log 的,把 sort 改成归并就是两只 log 的了。

AGC007F - *3600

我们考虑直观的贪心,就是假如已经钦定了每个点扩展到了哪个区间,我们就可以简单地贪心:从右往左,每个点挨着右边走,走到目标上面就垂直下去。这样这个就可以用双端队列之类的东西来维护了(维护拐点位置)。时间复杂度可以做到线性。

AGC008E - *3600

分类讨论情况很多。主要就是对每一个基环树分类讨论,然后把贡献拼起来。

AGC008F - *4000

考虑被重复计数的状态只保留 \(d\) 最小的那一个。经过分析可以推出每个点的 \(d\) 的取值范围是一个区间,可以用换根快速算出来。复杂度线性。

AGC009D - *3400

考虑是给每个点标号,然后相同标号的点之间必须存在比它标号大的点。可以考虑到答案是 \(\mathcal O(\log n)\) 级别的,所以可以直接用整数维护可选标号集合。然后遍历树的时候安排即可。

AGC009E - *3400

考虑转化题目中的计数方式,看成 \(k\) 叉树上的操作。那么可以发现会算重的方案只需要进位就能解决。然后就能看成简单的背包计数就好了。因为层数是 \((n+m-1)/(k-1)\) 所以时间复杂度没有问题。

AGC010D - *2800

一步步地分析应该就不难。考虑有 \(1\) 则很好判断。没有 \(1\) 也至少有一个奇数。若当前偶数数量为奇数个,那么显然你操作一个偶数使其变为奇数,除以的最大公约数肯定是奇数,故所有数的奇偶性不变。所以这种情况先手必胜。若有偶数个,则判断奇数数量,若大于一个则同上,先手必败。否则我们只能考虑操作唯一的奇数来造成可能的翻盘。这样所有数都会至少除以 \(2\)。递归地判断,复杂度是 \(\mathcal O(n\log V)\) 的。

AGC010E - *3900

感觉比较厉害的步骤挺多的,能够都想到的应该不多。首先我们假定先手把序列变成了 \(b\),那么对于 \(i<j\) 并且 \(b_i\) 和 \(b_j\) 互质的情况连一条有向边。那么所有合法的最终序列就是所有合法的拓扑序。这一点还是比较直观的。而字典序最大就只需要用优先队列来跑拓扑排序。然后我们就只需要考虑先手应该怎么做了。贪心地考虑就是小的元素作为连通块的根往下递归。由于我们可以用 dfs 树来表示一整个图,所以时间复杂度是 \(\mathcal O(n^2)\) 的。

标签:AtCoder,log,奇数,复杂度,mathcal,考虑,Contests,可以,杂做
From: https://www.cnblogs.com/TulipeNoire/p/18489130/AGC

相关文章

  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解总结
    AtCoderBeginnerContest379Rated:\(770\)A-Cyclic简单模拟。B-Strawberries字符串模拟,substr函数秒了C-Repeating中等模拟。思路:判断是否合法很简单,重点在计算花费。假设我们是\(0\)号点有\(N\)个棋子,然后移动到每个点上,显然花费为\(\frac{N(N+1)}{......
  • AtCoder Beginner Contest 379
    省流版A.模拟即可B.贪心,有\(k\)个就吃,模拟即可C.维护已经有棋子的格子,有多个棋子往右推,代价等差数列求和,模拟即可D.注意到植物高度=当前天-种植天,维护植物的种植天然后二分找对应高度的植物即可E.考虑最终答案每一个数位的值,然后处理进位即可F.单调栈处理建筑\(r\)......
  • Atcoder ABC 216 G 01Sequence 题解 [ 蓝 ] [ 差分约束 ]
    01Sequence:比较板的差分约束,但有一个很妙的转化。朴素差分约束设\(x_i\)表示第\(i\)位的前缀和。我们要最小化\(1\)的个数,就要求最小解,就要求最长路。因为约束条件都是大于等于号,所以求最长路才能满足所有条件。求最大解也是同理。我们可以对于每一个条件,列出如下不等式......
  • Atcoder Beginner Contest 379 (A-F)
    AtcoderBeginnerContest379(A-F)题目链接A-Cyclic#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidShowball(){chara,b,c;cin>>a>>b>>c;cout<<b<<c<<a<<""<......
  • AtCoder Beginner Contest 353 - VP 记录
    Preface这次比赛蛮简单的,就是黄题有点多,少了区分度。而且SigmaProblemAnotherSigmaProblemYetAnotherSigmaProblem是什么奇妙的题目名称?SigmaProblemAnotherSigmaProblemYetAnotherSigmaProblem\(\texttt{\scriptsizeYet\footnotesizeA......
  • AtCoder 板刷记录
    话说为啥这些场都没有G题的说[ABC200F]MinflipSummation显然的策略是把全部都是一个数的段变成全不都是另一个数,然后考虑进行dp设一个dp[i][0/1][0/1]表示一下前i个字符中奇偶性为j填的数是k时j的总和然后直接做就行了,需要矩阵快速幂加速一下[ABC201F]Insert......
  • 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]++;......
  • AtCoder Beginner Contest 356 - VP记录
    A-SubsegmentReverse点击查看代码#include<cstdio>#include<numeric>#include<algorithm>usingnamespacestd;constintN=105;intn,a[N],l,r;intmain(){ scanf("%d%d%d",&n,&l,&r); iota(a+1,a+n+1,1); reverse(a+l,......
  • AtCoder Beginner Contest 379
    这次又是倒在了t5,没救了。ABC379A-Cyclic难度:红#include<bits/stdc++.h>usingnamespacestd;intmain(){chara,b,c;cin>>a>>b>>c;cout<<b<<c<<a<<''<<c<<a<<b;return0;}B-......
  • C - Sowing Stones(python解)-atcoder
    C-SowingStones**(python解)-atcoder原题链接:C-SowingStones问题分析:每个包含石头的单元格X[i]中有A[i]个石头。我们需要确保每个单元格从1到N最终都有1个石头。思路:可用的石头总数必须等于单元格的总数。即需要N个石头,但只有ΣA[i](其中A[i]是单元格......