zoukankan      html  css  js  c++  java
  • 牛客网暑期ACM多校训练营(第二场)

    Rank Solved A B C D E F G H I J K
    44/452 4/11 O O Ø O Ø Ø Ø Ø O Ø Ø

    O: 当场通过

    Ø: 赛后通过

    .: 尚未通过

    A run

    solved by chelly


    chelly's solution

    签到

    B discount

    solved by chelly


    chelly's solution

    我们把限制总结一下:

    • 花p[i]-d[i]购买一个点
    • 花p[i]购买一个点和它的父亲
    • "花p[i]购买一个点和它父亲"这个不能连续

    就十分类似树上的匹配问题的,可以用dp求解
    然后这个图是个基环外向树森林,所以先扣出所有的环,然后做树DP,再做环DP即可

    C message

    upsolved by chelly


    chelly's solution

    直线y=ax+b和y=cx+d的交点横坐标是(-frac{b-d}{a-c}),于是我们可以将(a,b)和(c,d)看成两个点
    问题就转化成了,平面上有n个点,有m个询问点,你需要对每个询问点回答这个询问点和哪个点形成的斜率最小
    这就是个经典问题,容易知道答案一定在n个点形成的凸包上
    对于一个询问点(x,y),我们将凸包分块,分成该点左边和该点右边,那么答案在左边和右边就是单峰的,可以二分或者三分
    所以我们可以先离线询问点,然后在构下凸包的时候完成左边的操作,在构上凸包的时候完成右边的操作
    时间复杂度(O((n+m)log(n+m)))

    D money

    solved by chelly


    chelly's solution

    (dp[i])表示前i个商店做完后的最大收益
    (dp[i]=dp[i-1] (第i个商店不卖))
    (dp[i]=max(dp[j]+a[i]-a[j+1]) (第j+1个商店买,第i个商店卖))
    这样复杂度是(O(n^2))的,我们考虑每次维护(dp[j]-a[j+1])的最大值,即可降低复杂度到(O(n))

    E tree

    upsolved by chelly


    chelly's solution

    F trade

    upsolved by chelly


    chelly's solution

    首先可以通过暴力判断圆和直线的相交来把干扰器限制去掉
    这个问题里一个重要的操作就是在某个订单的时候,从某个仓库i运送了一些货物存到了仓库j里面,然后在后面某个订单的时候从j中取出装入车子上并送给顾客,这个相当于第i个仓库直接把货物卖给了后面的顾客
    我们考虑假如能求出一个数组can[i][j]表示第i个仓库能否卖给第j个订单的用户,那么剩下的问题就是左边有n个点表示仓库,右边m个点表示用户,然后跑最大流即可
    那我们怎么求出这个can[i][j]呢?
    能卖给第j个用户的关键就是在这之前第i个仓库能够通过某条路径到达订单j上的仓库
    我们设dp[i][1..n]表示目前为止,第1,2,...n个仓库能否到达第i个仓库
    显然对于第j个订单的仓库(x_1,x_2,...,x_p)(dp[x_{i+1}]|=dp[x_i]),那么最终(dp[x_p])中为1的那些仓库就是能把货物运送给目前的用户的仓库
    显然用bitset维护这个数组即可

    G transform

    upsolved by chelly


    chelly's solutiion

    考虑直接尺取,不是很好办,于是考虑二分答案num,然后去看一看我能不能取连续的num个货物
    我们可以每次尺取一个区间[l,r],使得这个区间里面的货物个数是小于等于num的极大值,然后枚举两种情况,一种是剩余的从l-1拿,一种是剩余的从r+1拿
    如何计算答案呢?我们知道中位数一定是在我们尺取的过程中也是单调的,所以维护一些东西计算就行
    时间复杂度(O(nlog_2(suma_i)))

    H travel

    upsolved by chelly


    chelly's solution

    dp[k][i][j]表示以u为根的子树,已经选了i条封闭的路径,有j个待向上延伸的路径(j=0/1)的情况下,最大的收益
    转移的时候稍微思考一下就行,可以先把所有孩子的信息收集起来,再统一向k转移
    转移的时候注重一个特殊情况,就是两条向上的链在k处封闭

    I car

    solved by ch


    ch's solution

    J farm

    upsolved by chelly


    chelly's solution

    考虑计算每个格子被非同色矩形覆盖了多少次
    这个东西等价于计算每个格子被覆盖的总次数-被其同色矩形覆盖的次数
    可以用二维数点来解决,时间复杂度(O(nmlogm))
    当然也有比较喵的随机做法,就是给不同的颜色rand一个权值,如果一个格子只被同色矩形覆盖过,那么它位置上最终的值一定是该颜色权值的倍数。这样时间复杂度是(O(nm))

    K carpet

    upsolved by chelly


    chelly's solution

    我们希望找到最小的一个循环节p,q,很容易发现行列是独立的,所以不妨分开考虑
    这里要注意一点,就是一个字符串s的循环节并不一定是最小循环节的倍数,所以我们只能暴力用Kmp处理出每一行的所有循环节,找出最小的出现了n次的循环节,就是所有行的最小公共循环节p
    求列最小公共循环节q同理
    好,现在我们得到了p和q,我们还要最小化子矩阵最大值
    容易发现这个子矩阵只要是个pq的就可以经过无限次平铺得到原来的矩阵
    问题就变成了,给你一个n
    m矩阵,找一个p*q的子矩阵,并最小化其中最大值
    我们可以对每一行扫一遍单调队列,再对列扫一遍单调队列即可
    时间复杂度(O(nm))

    Replay

    本场主要由chelly和ch打的,syf乘上了回家的客车于是无法参加。
    开场chelly切A,过了签到,然后认为B题是个签到,于是提交了个假算法。chelly看见B题没人通过,决定换题,去扣扣D,把B题丢给了ch。chelly磕磕绊绊把D过了,ch思考B题未果。然后chelly和ch共同思考I题,经过一番交流确定了解法,chelly想暴力求每一块的独立集,就在这时ch提出了一个简单结论,chelly和ch都觉得很有道理,于是ch写了代码,1A。此后chelly开H,ch继续想B。chelly误认为H是个费用流,开始码,码完发现要解决的是正权无向图的最大费用最大流,因为有正环的缘故,无法跑出来,chelly猜想这题应该是个树DP,但是细节太多,chelly便弃了这个题。此时J题过的人比较多,但ch和chelly都不会做。chelly继续思考B,转化了B的模型之后,发现就是一个基环外向树森林上的DP,然后码码码,在临近结束的时候A了。

  • 相关阅读:
    P1242 新汉诺塔(hanio)
    P2878 [USACO07JAN]保护花朵Protecting the Flowers
    P2096 最佳旅游线路
    [P1363] 幻想迷宫
    在矩阵上跑最小生成树
    tarjan+topsort
    tarjan缩点
    【P3398]】仓鼠找sugar
    树形数组暴力
    解决跨域问题
  • 原文地址:https://www.cnblogs.com/Amadeus/p/9347973.html
Copyright © 2011-2022 走看看