首页 > 其他分享 >ABC221G Jumping Sequences 题解

ABC221G Jumping Sequences 题解

时间:2024-10-03 10:23:12浏览次数:1  
标签:dots le leftarrow 题解 复杂度 Sequences Jumping BS pm

Jumping Sequences

把移动的上下左右改成左上、左下、右上、右下(坐标轴旋转 \(45\)°)。则最终目的地是 \((A+B,A-B)\)。

(以前移动的方式是 \((\pm d_i,0),(0,\pm d_i)\)。现在每次移动的方式是 \((\pm d_i,\pm d_i)\))

则 \(x,y\) 两维可以分开考虑。

目标:从 \(d_1\sim d_n\) 中选若干个数和为 \(w=\frac{A+B-\sum d_i}{2}\)。

DP,\(f[i][j]\) 表示前 \(i\) 个数和为 \(j\) 是否可行。

但是这个复杂度是 \(O(n^2D)\) 的,\(i\) 的范围 \(n\),\(j\) 的范围 \(n\times D.\)(\(D=\max d_i\))

如何优化?

可以 bitset 优化。\(O(\dfrac{n^2d}{32})\)。有点危险。


介绍一种新的方法。\(O(nD)\)。

我们找到一个数 \(b\),\(X=d_1+\dots+d_{b-1}\le w,d_1+\dots+d_b>w\)。

定义 Balanced Set:\(\{1,2,\dots,b-1\}\) 是一个 BS。 所有能通过下列两个操作从 \(\{1,2,\dots,b-1\}\) 变化到达的也是 BS。

  1. balanced insert:插入一个 \(\ge b\) 的数。这个操作要求当前的和 \(\le w\)。

  2. balanced delete:删除一个 \(<b\) 的数。这个操作要求当前的和 \(>w\)。

观察:所有 BS 的总和 \(\in [w-D,w+D]\)。

观察:最优解也是一个 BS。

为了方便,重新设状态定义,从 \(b\) 处向两边延申。

\(f_{l,r,j}\) 表示考虑 \([l,r]\) 内的操作,是否可以凑出 \(j\)。

初值 \(f_{b+1,b,X}=true.\)

转移:

  • \(f_{l,r,x}\leftarrow f_{l,r-1,x}\;,\;f_{l+1,r,x}.\)(不选)

  • \(f_{l,r,x+d_r}\leftarrow f_{l,r-1,x}.\;(x\le w)\)

  • \(f_{l,r,x-d_l}\leftarrow f_{l+1,r,x}.\;(x>w)\)

但复杂度还是没变。再重新设计。

\(g_{r,w}\) 表示满足 \(f_{l,r,w}=true\) 的 \(l\) 最大是多少。若不存在则为 \(0\)。

  • \(g_{r,x}\leftarrow g_{r-1,x}.\)

  • \(g_{r,x+d_r}\leftarrow g_{r-1,x}.\;(x\le w)\)

  • \(g_{r,x-d_l}\leftarrow l.\;(x>w,l<g_{r,w})\)

从左边转移但不操作 \(l\) 的情况不用考虑,因为 \(g\) 是取 \(\max\)。

状态数少了,但转移复杂度没变。瓶颈在于第三类转移。

注意到 \(l<g_{r-1,x}\) 时,其会在 \(r-1\) 用第一类转移到。所以只要转移 \(l\ge g_{r-1,x}\) 即可。

对于一个 \(x\),转移复杂度为 \(O(\sum g_{r,x}-g_{r-1,w})=O(n)\),所以总复杂度 \(O(nD)\)。

标签:dots,le,leftarrow,题解,复杂度,Sequences,Jumping,BS,pm
From: https://www.cnblogs.com/FLY-lai/p/18445431

相关文章

  • Codeforces Round 976 (Div. 2) 题解
    CodeforcesRound976(Div.2)题解2020B一个常见的想法:开关灯=异或,虽然在这道题里没啥用注意到,第i盏灯的按钮被按的次数就是i的除它本身以外的因子个数而完全平方数的因子数为奇数,其他数的因子数为偶数点击查看更多信息#include<bits/stdc++.h>usingnamespacestd;voi......
  • 题解:CF1976D Invertible Bracket Sequences
    可以在cnblog中阅读。题意给一个合法括号序列,问有多少区间\([l,r]\),使得将区间内的每个括号翻转后,括号序列仍合法。分析十分套路地,我们将(看成\(+1\),将)看成\(-1\),则一个括号序列合法的充要条件是转换后的序列满足:前缀和任意位置非负;最后一项为\(0\)。考虑翻转......
  • ZZJC新生训练赛第二场题解
    先给出比赛链接:https://ac.nowcoder.com/acm/contest/92036A小红打怪ShowCodeAclassPoint{//点类public:intx,y;Point(){}Point(intx,inty):x(x),y(y){}Pointoperator+(constPoint&P)const{returnPoint(x+P.x,y+P.y);......
  • 题解:TopCoder12316 ThreeColorability
    Vjudge可以出成《三色绘恋》背景。题意给一个格点数为\((n+1)\times(m+1)\)的网格,给格点染色,相邻的格点不能染成同样的颜色。每个格子有一条对角线的边,可选N形和Z形。现在有一个残缺的网格,存在一些格子的对角线连法不确定,构造一种字典序最小的方案使得至少存在一种染色......
  • 树上最值路径 题解
    题意简述给你一棵\(n\)个结点的树,编号为\(1\simn\),求有多少路径\(\operatorname{Path}(u\rightarrowv)\),满足\(u=\max\{x\midx\in\operatorname{Path}(u\rightarrowv)\}\),\(v=\min\{x\midx\in\operatorname{Path}(u\rightarrowv)\}\)。......
  • 题解:CF2014D Robert Hood and Mrs Hood
    差分,每次差分将\(\max(1,l-d+1)\)加\(1\),将\(r+1\)位置减\(1\)。然后前缀和求原数组,再遍历一下求最小值和最大值即可。代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ intt; cin>>t; while(t--){ intn,d,k; cin>>n>>d>>k;......
  • 题解:CF2009E Klee's SUPER DUPER LARGE Array!!!
    设\(m\)为\(a_1+\dots+a_i\),\(n\)为\(a_{i+1}+\dots+a_n\)。我们可以使用二分查找来搜索\(i\),使得\(m-n\)为最小的负数。如果我们移动到\(i+1\),则此时\(m-n\)为最小的整数。答案是两种情况下的最小绝对值。代码:#include<bits/stdc++.h>usingnamespacestd;pair<......
  • 题解:CF2009D Satyam and Counting
    比较容易观察的一道题,但是场上不开longlong见祖宗了。由于这题的\(x\)最大值比较小,所以我们可以直接存每个坐标是否有点。有两种三角形符号条件:存在两个点\((x,0),(x,1)\),可以观察到任意的其它点都可以成为第三点。有三个点为\((x,0),(x+1,1),(x+2,0)\)或\((x,1),(x+1......
  • 题解:CF2009C The Legend of Freya the Frog
    比较一眼的题目,场切了。分别考虑\(x\)和\(y\)。在\(x\)方向上我们需要的跳跃次数是\(\lceil\frac{x}{k}\rceil\),在\(y\)方向上我们需要的跳跃次数是\(\lceil\frac{y}{k}\rceil\)。考虑下面的两种情况:\(\lceil\frac{y}{k}\rceil\geq\lceil\frac{x}{k}\rceil......
  • 题解:P11137 [APC001] B - Checker
    注意到每个字符串长度相同,所以我们可以按照题意逐个遍历小K的题目和所有题库里的题目,统计相同位置字符相同的个数,如果大于\(\left\lceil\frac{k}{2}\right\rceil\),这两个题目就是重题。代码:#include<bits/stdc++.h>usingnamespacestd;boolc(stringa,stringb){in......