zoukankan      html  css  js  c++  java
  • Atcoder ARC 120

    A

    (;)
    会发现每次操作后当前数会变成序列中最大值,预处理出(na_1+(n-1)a_2+cdots +a_n)和前缀最大值直接计算即可
    总结:推柿子题
    (;)

    B

    (;)
    容易发现,处在同一对角线上的格子颜色必须相同,如果有两种颜色同时出现在一个对角线上,显然无解。
    否则乘法原理算一下就好了。
    总结:对于这种只能向下和向右的走的问题,路径会经过每一种对角线一次,不妨站在对角线的角度来看问题
    (;)

    C

    (;)
    操作时序列的总和不会变,所以若(sum A eq sum B),就无解。
    显然,在操作中向左走的数会+1,向右走的会-1,但(A_i+i)是不会变的。
    所以按照(A_i+i,B_i+i)分组,现在问题转化为(A)中的每个数都要找到(B)中和它匹配的位置,让操作总数最小。
    假如我们已经得到在(B)中与(A_i)匹配的位置(C_i)
    而操作数就是(C_1,C_2,cdots,C_n)这个序列的逆序对个数
    证明:
    我们首先会把(C_i=n)移到序列末尾,这样就再不用去管他了,然后接着就是(C_i=n-1,n-2,cdots,1)
    会发现,对于每个(C_i=x),在往后走的过程中,都会与其后面(C_i<x)的数发生一次交换。
    不过在算逆序对时候,也要判一下是否有解(大概就是看同组的数的数量是否相同)
    总结:对于一个排列(A),每次操作可以交换相邻两个数,那么让其变成({1,2,3,cdots,n})最少需要其逆序对个数的次数
    (;)

    D

    (;)
    先把(A)从小到大排序
    显然不管怎么匹配,让在(1leq xleq n,n<y eq 2n)这样的(x,y)匹配更好。
    这样我们一定可以构造出一组方案,从前往后做一遍括号匹配即可
    总结:不妨可以考虑一些特殊构造使得答案最大化
    (;)

    E

    (;)
    按照贪心策略,一个人初始会先选择一个方向,碰到人之后立马返回去碰另外一个人。
    可以画出横轴为位置,纵轴为时间这样的坐标系去思考,会更加直观。
    会发现,不可能连续三个人初始时方向相同,因为如果让其中两个人匹配(对着走),显然会更优。
    对于dp来说,我们可以强制(i)(i-1)是匹配的,这样根据(i-2)向左向右两种不同的走法,就有两种转移

    [ dp_i = egin{cases} dp_{i-2}+a_i-a_{i-3} \ dp_{i-3}+a_i-a_{i-4}\ end{cases} ]

    总结:对于一维问题,涉及到多点同时移动,可以画出时间与位置的坐标系,方便考虑。
    另外对于这种比较抽象的dp,可以尝试去强制某些条件,以达到减小情况数量,方便转移
    (;)

    Code

    (;)
    A:https://atcoder.jp/contests/arc120/submissions/22862625
    B:https://atcoder.jp/contests/arc120/submissions/22864912
    C:https://atcoder.jp/contests/arc120/submissions/22872612
    D:https://atcoder.jp/contests/arc120/submissions/22905914
    E:https://atcoder.jp/contests/arc120/submissions/22924677
    (;)

  • 相关阅读:
    Hadoop 的版本问题
    SSH 端口转发原理
    KM算法
    最大流算法小结
    pku 2195 KM算法求最小权二分匹配
    SAP(最短增广路算法) 最大流模板
    最大流模板
    pku 1459 最大流 SAP
    pku Drainage Ditches 简单最大流 直接套模板 注意可能有重边
    推荐:吴军 谷歌黑板报 《浪潮之颠》
  • 原文地址:https://www.cnblogs.com/czyty114/p/14819804.html
Copyright © 2011-2022 走看看