zoukankan      html  css  js  c++  java
  • 退役后做题记录

    退役后做题记录


    AGC030E Less than 3

    神仙题Orz

    首先,如果你修改了一个位置(i),那么(i-1),(i+1)一定不同,否则一定会出现连续三个一样的

    将0和1之间插入一条红线,1和0之间插入一条蓝线。那么红蓝线一定交替出现

    修改相当于移动一条线,移动方案相当于一个匹配(位置1以前、位置n以后可以看做有无数条红蓝交替的线)

    最妙的是,“不能出现连续三个一样的”限制没有了(因为一定能找到方案)

    枚举匹配的方案即可

    https://atcoder.jp/contests/agc030/submissions/6933519


    AGC029B Garbage Collector

    首先,取垃圾的代价固定,为(nX),可以无视。

    设取了(K)次垃圾,放垃圾代价就会是(KX)

    考虑一次取垃圾的过程,取了(x_1<x_2<ldots<x_s)处的垃圾。

    显然一定会先走到(x_s),然后返回途中收辣鸡。

    推一下,代价会是(5x_s+5x_{s-1}+7x_{s-2}+9x_{s-3}+ldots+(2s+1)x_1)

    收了(K)次辣鸡,会有(2K)个系数(5)(K)个系数(7,9,11,ldots),可以任意乘给(x)

    显然最大的(2K)个拿(5),以此类推,前缀和高高就行了

    https://atcoder.jp/contests/agc027/submissions/6921358


    AGC018C Coins

    首先消去(C)。所有(A,B)变成(A-C,B-C),最后答案加(sum C),就不需要取(C)了,只要取(x)(A)(y)(B)

    枚举一条分界线,左右都会从小到大取(A/B),用一个堆维护

    https://agc018.contest.atcoder.jp/submissions/6918307


    LOJ6294 touch

    我是傻逼

    先考虑(sum_{d|x}mu(d)=[x=1]),我们要求(sum_{path}sum_{d|gcd{path}}mu(d)),也就是对所有(d)求有多少条路径(gcd)是其倍数

    分开求跨过不确定边的路径和剩下的,不确定边把树分成了两棵树。

    不跨过不确定边的路径直接求,枚举(d)后,只保留权值是(d)倍数的边。路径数是(sum inom{siz}2),并茶几维护即可

    跨过不确定边的路径,(u,v)分出了两棵树,搜出两棵树所有点到(u/v)(gcd)。两棵树的(gcd)记为数组(A,B)

    那么如果不确定的边权为(w),这部分答案是(sum_{ain A,bin B,d|gcd(a,b,w)}mu(d))

    (s_i=sum_{ain A,bin B}[a|i][b|i])(注意0要特判)可以发现(ain A,bin B)会在(mathbb{lcm}(A,B))的倍数处计算一次。

    那么如果(i|w),答案加上(s_imu(i)),就只会算一次了

    https://loj.ac/submission/573269


    CF1205B Shortest Cycle

    (c_i)表示二进制位有(i)的数数量,如果有(c_ige 3)那么答案就是3了,否则(n)很小,暴力


    CF1205C Palindromic Paths

    黑白染色后,对于一种颜色,只要确定了一个数就能确定整个颜色的标号,而且黑色已经确定了

    然后怎么知道白色的标号呢?????

    暴力枚举,找到一个两种情况不同的询问,询问一下就行了。


    CF1205D Almost All

    神仙题

    首先选一个点作树根,只考虑经过根的路径

    那么先考虑一个问题,在一个大小为(n)的子树中,让每个点到根的路径长度凑出(a,2a,ldots,(n-1)a)

    这个很好构造。先找出所有儿子,分别为(son_1,ldots,son_m),子树大小为(siz_1,ldots,siz_m)。根到第(i)个儿子的边权是((1+sum_{j<i}siz_j)a),然后对每个儿子递归下去做。

    现在假设选了一个根节点(rt),将儿子分为两组(A,B),分别做上面的算法,其中(A)权值是(1,2,ldots,siz_A)(B)权值是(siz_A+1,2(siz_A+1),ldots,siz_B(siz_A+1))

    那么从(A)到根节点到(B)的路径可以凑出来(1)((siz_A+1)(siz_B+1)-1)中所有数

    考虑怎么将儿子分组,((siz_A+1)(siz_B+1)-1)可以到达(lfloorfrac{2n^2}{9} floor)

    显然两边尽量接近才能让结果更优

    如果(siz_A,siz_B)都不小于(lceilfrac{n-1}{3} ceil),那么最极端的情况就是(siz_A=frac{n-1}{3}),结果(ge (frac{n+2}{3})(frac{2n+1}{3})-1=frac{2n^2+5n-7}{9})

    需要的是(frac{2n^2}{9})。结果在(n>1)时正确,(n=1)无需考虑。

    那么需要选一个根和划分让(siz_A,siz_Bgeq lceilfrac{n-1}{3} ceil)

    如果子树数量(ge 4),一定有两个子树大小之和(le frac n2)可以不断合并。

    如果子树数量(ge 3),合并最小的两个子树,剩下那个大小一定(geqfrac{n-1}{3}),那么另一个大小也会(leq 2frac{n-1}{3})

    子树数量为(1)只可能是(n=2),无需考虑

    合并完之后子树数量只可能为(2),这时如果有一个子树大小(ge frac{2}{3}(n-1))就不合法。

    选重心做根,最大的子树大小小于等于(frac{n}{2}),就合法了。

    https://codeforces.com/contest/1205/submission/59208736

  • 相关阅读:
    编写高质量Python代码的59个有效方法
    排序NB三人组(快速排序/堆排序/归并排序)
    排序之插入排序
    编写高质量代码 改善Python程序的91个建议——笔记(三)
    ImportHelper 导出帮助类
    使用Layer弹出一个页面
    MongoDB使用手册
    MVC4设置@Html.BeginForm的ID
    LayerManage
    Layer弹窗返回数据回调
  • 原文地址:https://www.cnblogs.com/xzz_233/p/11366234.html
Copyright © 2011-2022 走看看