• 【11.17+11.22+11.23】Codeforces 刷题


    DP \text{DP} DP


    D. Treasure Hunting

    题意:

    有一个 n ∗ m n*m nm的矩阵,行的标号从 1 1 1 n n n,列的标号从 1 1 1 m m m,矩阵中共有 k k k个宝藏,第 i i i个宝藏的位置为 ( r i , c i ) (r_i,c_i) (ri,ci)。有 q q q个安全的列,第 i i i个安全的列的编号是 b i b_i bi

    最初你站在矩阵的左下角(也就是 ( 1 , 1 ) (1,1) (1,1)的位置),并且可以向左走(从 ( r , c ) (r,c) (r,c) ( r , c − 1 ) (r,c-1) (r,c1))和向右走(从 ( r , c ) (r,c) (r,c) ( r , c + 1 ) (r,c+1) (r,c+1))。同时,你也可是向上走(从 ( r , c ) (r,c) (r,c) ( r + 1 , c ) (r+1,c) (r+1,c)),但是你必须在安全的列上。由于某些玄学原因,你不可以向下走。

    你的任务是收集所有的宝藏,但是你的时间已经不多了,所以你必须走最快的路径。现在你要使用你的人脑大法来计算出最快的路径需要多少时间(经过有宝藏的格子时收集宝藏不消耗时间,只有移动消耗时间)。

    n , m , k , q ( 2 ≤ n , m , k , q ≤ 2 ∗ 1 0 5 , q ≤ m ) n,m,k,q(2≤n,m,k,q≤2*10^5,q≤m) n,m,k,q(2n,m,k,q2105,qm)

    思路:容易发现,对于一行,我们只需要关注两端的宝藏。当我们收集完一行的宝藏,我们就位于最左边或者最右边,然后走向最近的特殊列来进入下一行,那么一行就抽象出两个点。容易发现这一行的点连接下一行的点最多有 8 8 8 条边 。建图然后在拓扑图上跑一遍最短路即可。代码容易写的很繁琐。

    AC代码:https://codeforces.com/contest/1201/submission/181314581


    D. Cunning Gena

    题意:略。

    思路:枚举显示器的数量,对于满足数量要求的每个朋友,可以抽象为价值为 x x x 的物品,但是可以解决若干个对应问题。状态压缩 DP 最小花费即可。定义 d p ( i , j ) dp(i,j) dp(i,j) 表示前 i i i 个朋友解决状态为 j j j 的问题的最小花费。

    注意要对朋友按照 k k k 进行排序,才能对每个前缀枚举答案。

    AC代码:https://codeforces.com/contest/417/submission/181373058


    B. Wizards and Huge Prize

    题意:最开始你的背包有 k k k 的容积,有 n n n可以按照任意次序 参加的比赛,比赛分为两种(具体种类由输入给出),一种的奖品是给你的背包增加 a i a_i ai 的容积,另一种是一个体积为 1 1 1 的物品,只有 任意时刻背包都能装得下当前赢得的所有物品 才算合法的方案,问赢得的比赛总场数 ≥ l \geq l l 的合法方案的概率。

    思路:概率 DP 即可。

    AC代码:https://codeforces.com/contest/167/submission/182123019


    F. Pathwalks

    题意:

    给定 n n n 个点 m m m 条边的有向图,可能不连通,可能有重边,也可能会有自环。求最长的路径(可以经过重复节点),使得这条路径的编号和权值都严格单调递增,其中编号指输入的顺序。路径的长度是指经过边的数量。

    1 ≤ n , m ≤ 1 0 5 1\leq n,m\leq10^5 1n,m105 0 ≤ w i ≤ 1 0 5 0\le w_i\le10^5 0wi105

    思路:树上的 LIS ,可以使用 map 实现。注意修改时需要保证 map 内部的 value(值)仍然同为单调的。

    AC代码:https://codeforces.com/contest/960/submission/182103597


    构造题:


    B. Present

    题意:

    • 给出一个长度为 n n n 的数列 a a a。其中第 i i i 项为 a i a_i ai
    • 请你求出 ⨁ i = 1 n ⨁ j = i + 1 n ( a i + a j ) \bigoplus_{i=1}^{n}\bigoplus_{j=i+1}^{n}(a_i+a_j) i=1nj=i+1n(ai+aj)。其中 ⊕ \oplus 表示按位异或操作。
    • 2 ≤ n ≤ 4 × 1 0 5 2 \leq n \leq 4 \times 10^5 2n4×105 1 ≤ a i ≤ 1 0 7 1 \leq a_i \leq 10^7 1ai107

    思路:考虑找答案的每一位。枚举位数 b i t bit bit ,构造 b i = a i % 2 b i t + 1 b_i=a_i\%2^{bit+1} bi=ai%2bit+1 b i t bit bit 位以上没有贡献)。问题转化为序列 { b } \{ b \} {b} 有多少对 ( i , j ) (i,j) (i,j) 满足 2 b i t ≤ b i ⊕ b j < 2 b i t + 1 2^{bit}\leq b_i\oplus b_j <2^{bit+1} 2bitbibj<2bit+1 b i ⊕ b j ≥ 2 b i t + 2 b i t + 1 b_i\oplus b_j \geq 2^{bit}+2^{bit+1} bibj2bit+2bit+1 ,判断其奇偶性。二分即可。

    AC代码:https://codeforces.com/contest/1322/submission/181868398


    A. Alyona and mex

    题意:给定 n , m ( 1 ≤ n , m ≤ 1 0 5 ) n,m(1\leq n,m\leq 10^5) n,m(1n,m105) ,构造长度为 n n n 的非负整数序列 a a a ,使得对于给定的 m m m 个区间,满足 m m m 个区间的 mex i = l r a i \text{mex}_{i=l}^r a_i mexi=lrai 的最小值最大。

    思路:结论为,mex 下界的最小值最大为:最小区间长度。可以构造序列为 0 ∼ m i n l e n − 1 0\sim minlen-1 0minlen1 的周期序列,即可使得每个长度至少为 m i n l e n minlen minlen 的区间 mex 都大于等于 m i n l e n minlen minlen

    AC代码:https://codeforces.com/contest/739/submission/182127473


    D. Minimum Euler Cycle

    题意:

    n n n 个点的完全有向图的最小字典序欧拉回路的第 l l l r r r 个节点。

    2 ≤ n ≤ 1 0 5 2 \le n \le 10^5 2n105 , 1 ≤ l ≤ r ≤ n ( n − 1 ) + 1 1 \le l \le r \le n(n - 1) + 1 1lrn(n1)+1 , r − l + 1 ≤ 1 0 5 r - l + 1 \le 10^5 rl+1105

    题解:题解 CF1334D 【Minimum Euler Cycle】

    AC代码:https://codeforces.com/contest/1334/submission/182132223


    E. Replace the Numbers

    题意:略。

    思路:定义 t o i to_i toi 表示 i i i 会转移到哪个颜色,时间倒序维护即可。如果倒序到一个 x → y x\rightarrow y xy 的操作,那么令 t o x = t o y to_x=to_y tox=toy

    AC代码:https://codeforces.com/contest/1620/submission/182196661


    B. Make Them Equal

    题意:

    • 给出一个序列 a a a,求出一个长度不超过 3 n 3n 3n 的操作序列,使序列 a a a 中每个元素相等。

    • 定义一次操作为:选出 ( i , j , x ) (i,j,x) (i,j,x) 三元组,满足 i , j i,j i,j 为序列合法下标, x x x 1 0 9 10^9 109 以内非负整数,令 a i : = a i − x ⋅ i , a j : = a j + x ⋅ i a_i:= a_i-x\cdot i,a_j:=a_j+x\cdot i ai:=aixi,aj:=aj+xi

    • 必须保证操作过程中的任意时刻序列 a a a 中每个元素都非负。

    • 输出时先输出操作次数 k k k,然后输出 k k k 行操作序列。

    • 数据组数 t ≤ 1 0 4 t\le10^4 t104,序列长度 n ≤ 1 0 4 n\le10^4 n104,元素大小 1 ≤ a i ≤ 1 0 5 1\le a_i\le10^5 1ai105

    思路:容易发现,可以把所有的数量转移到 a 1 a_1 a1 头上,然后 a 1 a_1 a1 即可分出任意个数的数字给其他数字。对于前者, a 2 ∼ a n a_2\sim a_n a2an 从左到右移动到 a 1 a_1 a1 ,每个 i i i 最多两次操作。容易知道因为 a i ≥ 1 a_i\geq 1 ai1 ,因此在移动的过程中一定非负。

    AC代码:https://codeforces.com/contest/1416/submission/182197741

  • 相关阅读:
    在Form表单中对上传附件a-upload组件配置必填校验
    vue+DataV 易懂使用方式
    总结:Qt读写ini配置文件(QSettings)
    From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
    win10 安装 elasticsearch
    Three.js系列: 在元宇宙看电影,享受 VR 视觉盛宴
    接口数据源变更,用 DeepDiff 测
    MQ通道接收端绑定步骤
    分析训练速度慢
    Linux 虚拟网络类型(NAT和桥接)介绍
  • 原文地址:https://blog.csdn.net/weixin_51948235/article/details/128000974