首页 > 其他分享 >AtCoder Beginner Contest 267

AtCoder Beginner Contest 267

时间:2022-09-05 19:37:02浏览次数:107  
标签:AtCoder cnt Beginner rs pos merge 267 ls dis

https://atcoder.jp/contests/abc267

全部的 AC 代码:

https://atcoder.jp/contests/abc267/submissions/me?f.Task=&f.LanguageName=&f.Status=AC&f.User=HinanawiTenshi

E

题目要求最小化花费,而花费是所有花费的最大值,故考虑二分,记现在二分的值 \(mid\) 为 \(lim\)。

因为每次代价都是与删点所连点的边权和,所以尽量去找当前花费 \(\leq lim\) 的,找不到当然就继续去二分更大的值。

因此,我们可以执行一个 \(\tt{bfs}\),每次找花费 \(\leq lim\) 的点进行扩展,并在扩展当前点的同时对其邻点更新花费(也就是减去当前点权),当临点更新后花费 \(\leq lim\) 时入队。

F

由于需要求 \(u\) 点跳 \(k\) 步能够到达的树上的点,故尽可能找到 \(u\) 能够跳到的最远点,因为如果 \(u\) 跳到最远点都不足 \(k\) 步,那么必然无解

什么点可能成为距 \(u\) 的最远点呢?直观的想法是直径的两个端点 \(x, y\)。

证明:

不妨设 \(dis(u, x)\geq dis(u, y)\)。

假设能够找到点 \(v\) 使得 \(dis(u, v)> dis(u, x)\),那么找到 \(u\) 到达路径 \(x, y\) 上的点 \(u'\)。

我们有 \(dis(u', v)>dis(u',x)\),故 \(dis(u', v)+dis(u', y)=dis(v, y)>dis(u', x)+dis(u', y)=dis(x, y)\),与 \(x, y\) 为直径矛盾。

证毕。

下面的做法很简单:

就分别以 \(x, y\) 为根节点,求出 \(u\) 的 \(k\) 级祖先即可。

G

为了方便转移,对所给序列 \(w\) 进行升序排序

容易想到状态表示 \(f[i, j]\) 为前 \(i\) 个元素共有 \(j\) 个位置 \(pos\) 满足 \(w_{pos}<w_{pos+1}\)。(记为顺序位置

考虑 \(f[i, j]\) 如何转移到后面的状态。

对于第 \(i+1\) 个元素 \(w_{i+1}\),可以发现当插入 \(w_{i+1}\) 时(也就是将 \(w_{i+1}\) 挑选 \([1, i+1]\) 一个位置放入),要么会使原来的顺序位置个数不变,要么比原来多 \(1\)。

  • 对于不变的情况,有多少种方案呢?

    • 首先,插入位置 \(1\) 肯定不变,有一种。
    • 插入到与 \(w_{i+1}\) 等值的元素(记这样的元素有 \(cnt\) 个)后面,有 \(cnt\) 种。
    • 插入到已经产生的顺序位置 \(pos\) 的后面(也就是插入 \(pos, pos+1\) 之间),有 \(j\) 种。

    因此,\(f[i, j]\) 对 \(f[i+1, j]\) 的贡献为:\(f[i+1, j] += f[i, j]\times(1+cnt+j)\)。

  • 比原来多 \(1\) 的情况就是不变情况的补,即有 \(i+1-(1+cnt+j) = i-j-cnt\) 种,

    因此,\(f[i, j]\) 对 \(f[i+1, j]\) 的贡献为:\(f[i+1, j+1] += f[i, j]\times(i-j-cnt)\)。

EX

注意到值域很小,所以直接将答案拆奇偶然后进行 NTT 分治来合并背包即可。

记当前区间 \(u\) 取奇数个物品的背包为 \(u_{o}\),偶数个的为 \(u_{e}\),左右子区间分别记为 \(ls, rs\)。

分治过程即:

\[u_o = merge(ls_e, rs_o) + merge(ls_o, rs_e) \\ u_e = merge(ls_e, rs_e) + merge(ls_o, rs_o) \]

\(merge\) 用 NTT 卷积即可。

标签:AtCoder,cnt,Beginner,rs,pos,merge,267,ls,dis
From: https://www.cnblogs.com/Tenshi/p/16659253.html

相关文章

  • Atcoder Regular Contest 147
     AtcoderRegularContest147这是本蒟蒻第3次打的\(ARC\),赛时的时候\(B\)题调代码调崩了,\(wa\)了15发。所以来简略的写一下题解A:题目链接题目大意:略题目分析......
  • AtCoder Beginner Contest 267 解题报告
    A-Saturday题意:输入字符串代表周一至周五的某一天,输出这一天离周六还有多少天分析:映射一下,直接输入输出ac代码:#include<iostream>#include<algorithm>#inclu......
  • AtCoder Beginner Contest 267
    E-ErasingVertices2做法1观察可得:对于某个时刻,贪心删当前代价最小的点肯定是最优的。但是删一个点会减少相邻接的点的代价。然后就想到了堆,但是这个堆需要支持decre......
  • AtCoder Beginner Contest 267 E Erasing Vertices 2
    ErasingVertices2二分||贪心二分的做法就二分答案,然后检查一下能否删除,像拓扑一下跑一下就行#include<iostream>#include<cstdio>#include<algorithm>#includ......
  • ABC267总结
    比赛链接比赛情况AC:6/8题目分析A(语法入门)打表周一到周五即可B(基础算法)按照题意计算即可假如1号球没倒,则非法否则分别找最左和最右分别没倒的列,判断中间是否有一......
  • AtCoder ABC 259 F Select Edges
    题意:​ 给出一棵树,边带权,对于点i,最多保留d[i]条边,可以被分成连通块,请问边权和最大是多少分析:​ 因为可以被分成连通块,我们就可以对点i划分两种状态。第一种是点i不与父......
  • AtCoder Beginner Contest 266 G,H
    G考虑先放G和B,此时共有\(C_{G+B}^{B}\)种方案。然后选出\(k\)个G,在前面放上\(R\),共有\(C_{G}^{k}\)种方案。最后我们放剩下的\(R-K\)个R,考虑目前哪些区间内部可以放一段......
  • AtCoder Beginner Contest 266 一句话题解
    AandBsbt,不讲。C垃圾计算几何,问是不是一个凸包,搞份板子交就可以了。D简单dp,令\(f(i,j)\)表示第\(i\)个时间在第\(j\)个位置的最大价值,从上一个时间转移,可以......
  • NC235267 星球大战
    题目原题地址:星球大战题目编号:NC235267题目类型:map、list时间限制:C/C++2秒,其他语言4秒空间限制:C/C++262144K,其他语言524288K1.题目大意二维平面上n个坐标对应......
  • AtCoder Beginner Contest 266
    比赛链接:https://atcoder.jp/contests/abc266C-ConvexQuadrilateral题意:平面图上有一个四边形,按照逆时针顺序给定四个点的坐标,判断四边形是不是凸的。思路:求两条......