2022牛客暑期多校训练营1

G - Lexicographical Maximum

签到题。

A - Villages: Landlines

简化题意:给你 nnn 条线段,问你把这些线段铺到数轴上之后,未被覆盖的区域总长是多少?(无需考虑最左端以左和最右端以右)

签到题,依题意模拟即可。

D - Mocha and Railgun

一道简单的平面几何题,推出题目要求的式子即可。

I - Chiitoitsu

一道关于日本麻将的数学期望题。

初始牌堆有 136136136 张牌(共 343434 种不同的牌,每种有 444 张),先发给你 131313 张作为初始手牌(由输入给定),每一轮进行如下 333 个步骤:

(1)从牌堆中随机抽取一张牌。

(2)检查手中的 141414 张牌是否构成 777 个对子,如果是,游戏立即结束;否则转入第 333 步。

(3)从手牌中选择一张牌丢入弃牌堆,即表示这张牌未来再也不会被抽到了。

问你采用最优策略下,期望多少轮后游戏结束。

一件非常显然的事是,如果抽到的是“杂牌”,即与初始手牌均不一样的一张牌,那必然选择丢弃这张牌,因为用它替换手里的牌显然不会更优。

因此我们可以发现,最后的 ansansans 仅与初始拥有的对子数有关,而初始拥有的对子数只可能是 0−60-60−6,暴力打表即可。

PS:初始对子数为 000 时,暴力 dfsdfsdfs 需要相当久的时间,而正好题目中的样例就是初始对子数等于 000 的情况,因此我们直接把样例那个 ansansans 抄过去,再结合 111 ~ 666 的 ansansans,就直接 ACACAC 了。

J - Serval and Essay

给你一张 nnn 个点 mmm 条边的无重边无自环的有向图,初始时可以选择一个点染黑,其余点均为白点。若某个点所有入边的起点均为黑点,则该点可以被染黑,问你图中最多能有多少个黑点。

朴素做法是枚举每个点 iii 作为初始黑点,然后遍历一遍求 ansians_iansi​,显然会 TTT。

考虑优化。不难发现 ansansans 之间存在包含关系,若 ansyans_yansy​ 包含 ansxans_xansx​,则我们可以将 xxx 看作 yyy 的祖先。因此可以得到一个森林,森林中的最大树即为答案。

最后用启发式合并加速迭代过程即可。

C - Grab the Seat!

二维平面,屏幕是 (0,1)−(0,m)(0,1)-(0,m)(0,1)−(0,m) 的线段。有 nnn 行 mmm 列座位在屏幕前面,是坐标范围 1≤x≤n,1≤y≤m1\leq x\leq n,1\leq y\leq m1≤x≤n,1≤y≤m 的整点,其中 kkk 个座位已经有人,求出到屏幕的视线不被任何人挡住的座位数量。

qqq 次询问,每次修改一个人的坐标后求出答案。

整个区域实际上构成一个折线图,这个折线图由 2k2k2k 条线段构成,而这 2k2k2k 条线段又有比较明显的性质,就是延长线都经过 (0,1)(0,1)(0,1) 或 (0,m)(0,m)(0,m)。因此可以把它们分成两类,对于延长线经过这两个点的线段分别维护一下斜率。

首先对每个 yyy,如果这一列有多个人,那么肯定考虑 xxx 最小的人,因为小的会完全覆盖大的。然后对于 (0,1)(0,1)(0,1) 和 (0,m)(0,m)(0,m) 分开考虑。

以 (0,1)(0,1)(0,1) 为例,所有线段都是从某个点往右上方走。

如果按 yyy 从小到大加入线段,不难发现斜率大的线段一旦加入,就一直会覆盖斜率小的线段。对于某个 yyy,要找到最小的合法 xxx,那么肯定取的是前面所有线段中斜率最大的线段。所以对 yyy 正着扫一遍,在扫的同时维护一下最大的斜率,即可得出每一列只考虑经过 (0,1)(0,1)(0,1) 的线段的答案。

对于 (0,m)(0,m)(0,m) 同理,倒着扫一遍维护斜率最小(绝对值最大)的线段即可。

每个 yyy 在两种情况下取 minminmin 就是答案。总复杂度为 O(mq)O(mq)O(mq) 。

B - Spirit Circle Observation

给你一个长度为 nnn 的数字串 sss,计算满足下列条件的二元组 (A,B)(A,B)(A,B) 个数:

(1)AAA、BBB 是 sss 的子串。

(2)AAA、BBB 长度相同。

(3)B=A+1B=A+1B=A+1。

可以发现满足条件的子串一定是 A=xp99...9‾,B=x(p+1)00...0‾A=\overline{xp99...9},B=\overline{x(p+1)00...0}A=xp99...9​,B=x(p+1)00...0​,其中前缀 xxx 是一个相同的数字串(可以为空),p∈[0,8]p\in[0,8]p∈[0,8],且后缀的 99..999..999..9 和 00...000...000...0 长度相同(可以为空)。因此枚举 ppp 的值后,实际只需要考虑对固定长度的 99..999..999..9 和 00...000...000...0,计算所有可能的前缀 xxx 的贡献。

可以用 SAMSAMSAM 求出 failfailfail 树,然后枚举所有可能的 ppp。我们考虑枚举 99..999..999..9 和 00...000...000...0 的长度,并将形如 xp199...9‾(p1≠9)\overline{xp_199...9}(p_1\neq9)xp1​99...9​(p1​​=9) 和 xp2000...0‾(p2=p1+1)\overline{xp_2000...0}(p_2=p_1+1)xp2​000...0​(p2​=p1​+1) 的 p1,p2p_1,p_2p1​,p2​ 的位置视为关键点。可以发现对所有长度而言,关键点的总数是 O(n)O(n)O(n) 的。

对于一组相同的长度,可以在 failfailfail 树的某个结点统计其底下 p1,p2p_1,p_2p1​,p2​ 类关键点的贡献,这两类关键点在该结点能取到的所有前缀 xxx 正是该结点的 SAMSAMSAM 子串等价类,维护该信息是 O(1)O(1)O(1) 的。

对每种长度,建立虚树跑上述信息即可。

2022牛客暑期多校训练营2

G - Link with Monotonic Subsequence

签到题。

J - Link with Arithmetic Progression

给你一个数列 aaa,将其修改为一个等差数列 bbb,代价为 ∑i=1n(ai−bi)2\sum\limits_{i=1}^n(a_i-b_i)^2i=1∑n​(ai​−bi​)2,求最小代价。

签到题,本质是一个线性回归,直接套式子即可。

K - Link with Bracket Sequence I

已知括号序列 aaa 是一个长度为 mmm 的合法括号序列 bbb 的子序列,求可能的序列 bbb 的数量。

记 dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示在序列 bbb 的前 iii 位中,与 aaa 的 LCSLCSLCS 为 jjj,且左括号比右括号多 kkk 个的方案数。转移时枚举下一位填写的是哪种括号即可。

D - Link with Game Glitch

在一个游戏中有 nnn 个物品,mmm 对物品置换关系,每对置换关系形如“你可以用 aaa 个 bbb 换 ccc 个 ddd”。然而不幸的是,由于参数设置出现了问题,玩家可以通过反复置换来获取无限多个物品(例如 111 个 xxx 换 222 个 yyy,111 个 yyy 换 222 个 xxx)。

作为游戏开发人员,你需要修复这个 bug,而修复的办法非常简单粗暴——将所有的 ccc 改为 w⋅cw\cdot cw⋅c 。你的任务是找到 www 的最大值(显然 www 小于 111)。

二分答案。check 的方法类似于 SPFASPFASPFA 找“负环”,实际上是求最长路,如果一个点被松弛超过 nnn 次,说明图中存在一个乘积大于 111 的环,即此次的 www 是非法的,否则合法。

考虑到乘积可能过大,实现的时候用 logloglog 将乘法转换为加法即可。

代码如下:

#include<bits/stdc++.h>
const int MAXN=2022;
int read()
{int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while('0'<=c&&c<='9'){x=(x<<3)+(x<<1)+(c^'0');c=getchar();}return x*f;
}
struct edge
{int to;double val;edge* next;edge(int _to,double _val,edge* _next){to=_to;val=_val;next=_next;}
};
std::vector<edge*> head(MAXN);
void add(int x,int y,double z)
{head[x]=new edge(y,z,head[x]);
}
double dis[MAXN];
int cnt[MAXN];
bool v[MAXN];
bool check(int n,double w)
{w=log(w);std::queue<int> q;for(int i=1;i<=n;i++){dis[i]=cnt[i]=0;q.push(i),v[i]=true;}while(q.size()){int now=q.front();q.pop(),v[now]=false;for(edge* i=head[now];i;i=i->next)if(dis[i->to]<dis[now]+i->val+w){dis[i->to]=dis[now]+i->val+w;if(!v[i->to]){q.push(i->to),v[i->to]=true;++cnt[i->to];if(cnt[i->to]>n)return 0;}}}return 1;
}
void solve()
{int n=read(),m=read();for(int i=1;i<=m;i++){int a=read(),b=read(),c=read(),d=read();add(b,d,log(1.0*c/a));}double l=0,r=1;while(r-l>1e-6)if(check(n,(l+r)/2))l=(l+r)/2;elser=(l+r)/2;printf("%.10lf\n",l);
}
int main()
{int t=1;while(t--)solve();return 0;
}

E - Falfa with Substring

对于所有的 0≤i≤n0\leq i\leq n0≤i≤n,求长度为 nnn 的字符串中恰好出现了 iii 个 bitbitbit 子串的字符串数量。

先求至少出现了 kkk 个 bitbitbit 串的数量 FkF_kFk​,显然有 Fk=Cn−2kk×26n−3kF_k=C_{n-2k}^k\times 26^{n-3k}Fk​=Cn−2kk​×26n−3k。

套上容斥,得到答案为 Gk=∑j≥k(−1)j−k×Cjk×FjG_k = \sum_{j\ge k}(-1)^{j-k}\times C_j^k\times F_jGk​=j≥k∑​(−1)j−k×Cjk​×Fj​,直接计算显然会 TTT,考虑优化。

首先分离系数得到 k!×Gk=∑j≥k(j!×Fj)(−1)j−k(j−k)!k!\times G_k=\sum_{j\ge k}(j!\times F_j)\frac{(-1)^{j-k}}{(j-k)!}k!×Gk​=j≥k∑​(j!×Fj​)(j−k)!(−1)j−k​,然后发现它是卷积的形式,设 Pi=i!×Fi,Qi=(−1)n−i(n−i)!,Rn+i=i!×GiP_i=i!\times F_i,Q_i=\frac{(-1)^{n-i}}{(n-i)!},R_{n+i}=i!\times G_iPi​=i!×Fi​,Qi​=(n−i)!(−1)n−i​,Rn+i​=i!×Gi​,则有 R=P×QR=P\times QR=P×Q,所以我们直接使用 NTTNTTNTT 加速一下式子计算就做完了。

2022牛客暑期多校训练营3

C - Concatenation

签到题。

PS:出题人好像想让选手用线性复杂度做法,但是又由于 judge 不太稳,担心卡常数影响队伍体验,时限开得比较松。最后结果是暴力 sort 也让过了,作为一个签到题。

A - Ancestor

给你两棵带点权的树 AAA、BBB,给出 kkk 个关键点的编号,问有多少种方案使得去掉恰好一个关键点使得剩余关键点在树 AAA 上 LCALCALCA 的权值大于树 BBB 上 LCALCALCA 的权值。

签到题,预处理前缀 LCALCALCA 和后缀 LCALCALCA,然后枚举去掉的关键结点并使用前后缀 LCALCALCA 算出剩余结点的 LCALCALCA 比较权值即可。

J - Journey

给定一个城市有若干十字路口,右转无需等红灯,直行、左转和掉头都需要,求起点到终点最少等几次红灯。

把每条路看作点,在十字路口处连边,形成一个边权为 0/10/10/1 的有向图。

一开始写的 dijkstradijkstradijkstra 求最短路,结果竟然 TTT 了,然后改成 0/1BFS0/1BFS0/1BFS + 手写 dequedequedeque 还是 TTT,有点自闭。最后把 mapmapmap 改成 unordered_mapunordered\_mapunordered_map 才过,看来 mapmapmap 的常数因子确实相当大。

PS:掌握一些奇技淫巧还是相当有用的,说不定就能多过一道题。

H - Hacker

给你 111 个长度为 nnn 的小写字符串 AAA 和 kkk 个长度为 mmm 的小写字符串 BiB_iBi​,BBB 的每个位置拥有统一的权值,对于每个 BiB_iBi​ 求最大和区间满足该区间构成的字符串是 A 的子串(空区间合法)。

实际上是对 BiB_iBi​ 的每个位置,求出它作为结束位置在 AAA 中的最长子串长度,然后在该区间求最大子段和,所有位置的最大值即为答案。

对于每个位置的最长子串,可以对 AAA 建 SAMSAMSAM,然后 BiB_iBi​ 从左往右在 AAA 的 SAMSAMSAM 上转移,如果当前结点无法转移跳至父亲结点,最后无法转移则长度为 000,转移成功则为转移前结点的最大长度 + 111。

F - Fief

一道很好玩的图论题。

给你一个无向图,每次询问两点 xxx、yyy,求是否存在一个 nnn 的排列,使得第一个元素为 xxx,最后一个元素为 yyy,且排列的任意一个前缀、任意一个后缀都连通。

该题意等价于问你添加一条边 (x,y)(x,y)(x,y) 后,图是否是点双连通的。

首先,我们求出这幅图的所有双连通分量,不难发现只有割点会同时存在于多个双连通分量中,而其他点只可能存在于一个双连通分量里。

接下来我们讨论 444 种特殊情况:

(1)图不连通,直接全部输出 NO 即可。

(2)这副图只有一个双连通分量,即这幅图本身就是点双连通的,直接全部输出 YES 即可。

(3)这幅图存在一个割点,满足其同时存在于两个以上的双连通分量中,那么无论你添加哪条边,图都不可能是点双连通的,直接全部输出 NO 即可。

(4)这幅图存在一个双连通分量,满足其同时包含两个以上割点,那么无论你添加哪条边,图都不可能是点双连通的,直接全部输出 NO 即可。

如果你把一个双连通分量看成一个点,把割点看成一条边,你会惊奇地发现:如果这幅图不属于以上 444 种情况,那么这幅图一定是一条链。

所以只有当 xxx、yyy 分别来自于首尾那俩双连通分量(且不是割点),才能保证添加一条边 (x,y)(x,y)(x,y) 后,图是双连通的。

2022牛客暑期多校训练营4

K - NIO’s Sword

在一个游戏中有 nnn 个敌人,你需要依次杀死这 nnn 个敌人,杀死第 iii 个敌人的充要条件是 A≡i(modn)A\equiv i(mod\ n)A≡i(mod n),其中 A 是你的宝剑的攻击力。

你随时可以升级你的武器,每次升级你需要选择一个不超过 101010 的整数 xxx,然后宝剑的攻击力会从 AAA 变成 10A+x10A+x10A+x。

问你最少需要升级多少次才能消灭所有的敌人。

签到题,对于每个敌人,暴力计算杀死他需要升级多少次即可。

N - Particle Arts

有 nnn 个粒子,每个粒子有个能量 aia_iai​。两两随机碰撞,每碰撞一次,两粒子的能量分别变为 a&ba\&ba&b 和 a∣ba|ba∣b,求所有粒子能量稳定后的方差(稳定当且仅当任意碰撞无意义)。

签到题,不难发现稳定时 a&b=aa\&b=aa&b=a 或 a&b=ba\&b=ba&b=b,将此时的 aia_iai​ 排序,那么每个二进制位必为前面 000 后面 111,否则不满足包含关系。

所以直接统计每个二进制位有几个 000,有几个 111 就可以把稳态确定下来了。

D - Jobs (Easy Version)

有 nnn 个公司,第 iii 个公司有 mim_imi​ 份工作,每个工作对 IQIQIQ、EQEQEQ、AQAQAQ 分别有数值要求,必须三个数值都达标才能胜任这份工作。一个人只要能胜任一个公司的任意一份工作就可以去这个公司工作。

qqq 次询问,每次给出一个三元组,代表一个人的 IQIQIQ、EQEQEQ、AQAQAQ,问这个人最多可以去几个公司工作。

强制在线,nnn 不超过 101010,IQIQIQ、EQEQEQ、AQAQAQ 均不超过 400400400。

签到题,考虑到 nnn 和 ccc(三商)很小,所以我们可以直接设 dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示 IQIQIQ 为 iii、EQEQEQ 为 jjj、AQAQAQ 为 kkk 的人能去哪几个公司(状压一下)。然后对于每份工作,暴力维护 dpdpdp 数组即可。

H - Wall Builder II

给你 nnn 个 1×11\times 11×1 的矩形,n−1n-1n−1 个 1×21\times 21×2 的矩形,n−2n-2n−2 个 1×31\times 31×3 的矩形,……,111 个 1×n1\times n1×n 的矩形,把这些小矩形拼成一个大矩形(拼接时不可旋转小矩形),问你大矩形的最小周长。

签到题,首先可以求出大矩形的面积 SSS,然后枚举长宽并暴力验证即可。验证时可以贪心,把所有小矩形从长到短依次放进去,从下到上一行一行试着放,遇到某一行能放就放。

PS:比赛时根本没暴力验证,感觉直接选取最接近正方形的那个长宽就行,肯定是能构造出来的(手玩了几组数据没发现反例),然后交上去就过了。

A - Task Computing

从 nnn 个任务中选 mmm 个出来并任意排序,收益是 ∑i=1mwai∏ji−1paj\sum_{i=1}^mw_{a_i}\prod_j^{i-1}p_{a_j}i=1∑m​wai​​j∏i−1​paj​​,求最大收益。

首先把 nnn 个任务按照 wax+waypax<way+waxpayw_{a_x}+w_{a_y}p_{a_x}<w_{a_y}+w_{a_x}p_{a_y}wax​​+way​​pax​​<way​​+wax​​pay​​ 重新排序,这样就仅需选择 mmm 个出来,而无需选出来之后再排序了。

接下来显然是个 dpdpdp,由于正着 dpdpdp 时,每次转移会依赖于之前选择的任务的 ppp 之积,而那玩意显然没法跟着 dpdpdp 一起维护,所以我们考虑倒着 dpdpdp。

设 dp[i][j]dp[i][j]dp[i][j] 表示从后往前考虑到了第 iii 个任务,从中选择了 jjj 个任务的最优收益,则有状态转移方程 dp[i][j]=max(dp[i+1][j],dp[i+1][j−1]∗p[i]+w[i])dp[i][j]=max(dp[i+1][j],dp[i+1][j-1]*p[i]+w[i])dp[i][j]=max(dp[i+1][j],dp[i+1][j−1]∗p[i]+w[i])。

可以发现这样就完美避开了前缀积的问题,因为每次的 ppp 就自然而然地乘给后面的所有任务了。

C - Easy Counting Problem

题意十分简单,统计长度为 nnn 且数字 iii 至少出现 cic_ici​ 次的数字串数量。

由指数生成函数易得 ans=[xnn!]∏k=09(ex−∑i=0ck−1xii!)ans=[\frac{x^n}{n!}]\prod_{k=0}^9(e^x-\sum_{i=0}^{c_k-1}\frac{x^i}{i!})ans=[n!xn​]k=0∏9​(ex−i=0∑ck​−1​i!xi​),由于 nnn 很大没法直接卷出来,观察到后面的和式较短,令 y=ex,fk(x)=∑i=0ck−1xii!y=e^x,f_k(x)=\sum_{i=0}^{c_k-1}\frac{x^i}{i!}y=ex,fk​(x)=i=0∑ck​−1​i!xi​,将原式看作一个关于 yyy 的多项式(其系数为关于 xxx 的多项式)。

对 yyy 暴力卷积,对 xxx 做 NTTNTTNTT 即可求出一个形如 ∑(ex)ixfi(x)\sum (e^x)^ixf_i(x)∑(ex)ixfi​(x) 的式子。

对于每个询问扫一遍 yky^kyk 的系数即可求出答案。

2022牛客暑期多校训练营5

G - KFC Crazy Thursday

给你一个字符串,求以字母 kkk、fff、ccc 结尾的回文子串的数量。

签到题,先用 manachermanachermanacher 算法求出每个点的回文半径,然后统计一下 kkk、fff、ccc 的前缀和,最后枚举每个点作为结尾统计 ansansans 即可。

K - Headphones

有 nnn 副耳机(共 2n2n2n 只耳机)散乱地放在抽屉里,你的妹妹从中随机取出了 2k2k2k 只耳机,问你要从抽屉中随机取出至少多少只耳机,才能保证匹配出来的正确耳机数,一定比你妹妹匹配出的要多。

签到题,考虑最坏情况,你的妹妹成功匹配出了 kkk 副耳机,所以你必须要匹配出 k+1k+1k+1 副耳机,才能胜过你的妹妹。而根据抽屉原理,你只需要取出 (n−k)+(k+1)=n+1(n-k)+(k+1)=n+1(n−k)+(k+1)=n+1 只耳机,就可以保证一定能匹配出 k+1k+1k+1 副耳机。

如果剩余的耳机数不足 n+1n+1n+1,输出 −1-1−1 即可。

B - Watches

有 nnn 块手表,第 iii 块的价格是 aia_iai​。但是你生活在一个赋税严重的国家,如果你总共购买了 kkk 块手表,那么第 iii 块手表的价格就从 aia_iai​ 变成 ai+k×ia_i+k\times iai​+k×i 了。你有 mmm 块钱,问你最多能买多少块表。

签到题,二分答案即可。

H - Cutting Papers

一道简单的平面几何题,推出题目要求的式子即可。

F - A Stack of CDs

模板题,求圆交的周长。

C - Bit Transmission

有一个 010101 字符串,对某些位置询问是否是 111,共询问 3n3n3n 次。最多只有一次询问会返回错误答案,问你能否通过这些询问结果唯一确定字符串。

如果能,输出那个唯一确定的字符串;如果不能,输出 −1-1−1。

签到题,依题意模拟即可。

D - Birds in the tree

给你一棵无根树,每个点非黑即白。问你这棵无根树有多少个子树,满足其叶子同色(无根树的叶子即度数为 111 的点)。

只要是树上问题,哪怕是无根树,也要先转化成有根树来做。

考虑树上 dpdpdp。设 dp[0][x]dp[0][x]dp[0][x] 表示以 xxx 为根的子树中,根与叶子均为白色的子树(白树)的数量;dp[1][x]dp[1][x]dp[1][x] 表示以 xxx 为根的子树中,根与叶子均为黑色的子树(黑树)的数量。

根据定义,我们可以很快写出下面的状态转移方程:若 xxx 为白色,则 dp[0][x]=∏(dp[0][y]+1),dp[1][x]=∑dp[1][y]dp[0][x]=\prod(dp[0][y]+1),dp[1][x] = \sum dp[1][y]dp[0][x]=∏(dp[0][y]+1),dp[1][x]=∑dp[1][y];若 xxx 为黑色,则 dp[1][x]=∏(dp[1][y]+1),dp[0][x]=∑dp[0][y]dp[1][x]=\prod(dp[1][y]+1),dp[0][x] = \sum dp[0][y]dp[1][x]=∏(dp[1][y]+1),dp[0][x]=∑dp[0][y],其中 y 是 x 的儿子。

然而这样转移存在一个显著的问题,为了说明这个问题,我们不妨假设 xxx 为白色,yyy 为黑色。

在计算 dp[0][y]dp[0][y]dp[0][y] 的时候,由于 yyy 为黑色,它不能作为白树的根,所以只能把儿子们的 dp[0][z]dp[0][z]dp[0][z] 简单地加起来作为 dp[0][y]dp[0][y]dp[0][y],这一步在当时看来确实没什么问题。但是,在计算 dp[0][x]dp[0][x]dp[0][x] 的时候,y 就不再需要作为白树的根了,那么这时再用 dp[0][y]dp[0][y]dp[0][y] 来更新 dp[0][x]dp[0][x]dp[0][x] 就显得有点不够用了。

事实上,那时我们应该用 (dp[0][z]+1)(dp[0][z]+1)(dp[0][z]+1) 之积来更新 dp[0][x]dp[0][x]dp[0][x],而不是 dp[0][z]dp[0][z]dp[0][z] 之和。

为此,我们再引入 dp[2][x]dp[2][x]dp[2][x],表示以 xxx 为根,叶子均为 xxx 异色的子树的数量。显然,dp[2][x]dp[2][x]dp[2][x] 存在的价值和意义,仅仅是为了服务 xxx 的父亲。

综上所述,我们可以总结出完整的状态转移方程:

A - Don’t Starve

在二维平面上有 nnn 个点,你从原点 (0,0)(0,0)(0,0) 出发,每一轮游戏你可以前往任意一个点,代价是两点之间的距离。你要保证每一轮的代价单调递减,问最多能进行多少轮游戏。

我们可以研究整个游戏的逆过程,则这题变为“任选一个点作为起点,每一轮游戏你可以前往任意一个点,但要保证距离递增,问最多能进行多少轮游戏”。

挺一眼 dpdpdp 的吧,我们可以设 dp[i][j]dp[i][j]dp[i][j] 表示考虑到第 iii 条边,以 jjj 作为起点,最多能进行多少轮游戏,则有 dp[i][j]=max(dp[i−1][j],dp[i−1][k]+1)dp[i][j]=max(dp[i-1][j],dp[i-1][k]+1)dp[i][j]=max(dp[i−1][j],dp[i−1][k]+1),其中第 iii 条边为 jjj 到 kkk。

这样转移相当于把起点从 kkk 延伸到了 jjj,而延伸的前提是第 iii 条边的长度更长,那么我们把边按长度递增排序即可,值得注意的是长度一样的边要“同步”转移。

最后用滚动数组优化 dpdpdp 即可,代码如下:

#include <bits/stdc++.h>
#define int long long
const int MAXN = 2e3 + 5;
int read()
{int x;std::cin >> x;return x;
}
int x[MAXN], y[MAXN];
struct edge
{int a, b;int dis;edge(int _a = 0, int _b = 0){a = _a, b = _b;dis = (x[b] - x[a]) * (x[b] - x[a]) + (y[b] - y[a]) * (y[b] - y[a]);}bool operator<(const edge& x)const{return dis < x.dis;}
}e[MAXN * MAXN];
int dp1[MAXN], dp2[MAXN];
void solve()
{int n = read();for (int i = 1; i <= n; i++)x[i] = read(), y[i] = read();int m = 0;for (int i = 0; i <= n; i++)for (int j = 0; j <= n; j++){if (i == j)continue;e[++m] = edge(i, j);}std::sort(e + 1, e + m + 1);int l = 1, r = 1;for (int i = 1; l <= m; i++, l = r + 1){while (r < m and e[r + 1].dis == e[l].dis)r++;for (int j = l; j <= r; j++)//“同步”转移if(e[j].b)dp2[e[j].a] = std::max(dp2[e[j].a], dp1[e[j].b] + 1);for (int j = l; j <= r; j++)dp1[e[j].a] = std::max(dp1[e[j].a], dp2[e[j].a]);}std::cout << dp1[0] << '\n';
}
signed main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);int t = 1;while (t--)solve();return 0;
}

2022牛客暑期多校训练营6

J - Number Game

签到题。

G - Icon Design

签到题,依题意模拟即可。

B - Eezie and Pie

给你一棵有根树,每个点 iii 会对它的 000 ~ did_idi​ 级祖先产生 111 的价值,求最终每个点的价值。

签到题,树上倍增找每个点 iii 的 did_idi​ 级祖先,然后树上差分即可。

PS:题解给出了一种 O(n)O(n)O(n) 的做法,在 dfsdfsdfs 的时候维护 dfsdfsdfs 栈,那么访问到点 iii 时,它的 did_idi​ 级祖先一定在当前栈顶向下 did_idi​ 个。

A - Array

给你一个长度为 nnn 的序列 ,满足 ∑i=1n1ai≤12\sum\limits_{i=1}^n\frac{1}{a_i}\leq\frac{1}{2}i=1∑n​ai​1​≤21​。

你需要构造一个长度为 mmm 的序列 c0,c1,...,cm−1c_0,c_1,...,c_{m-1}c0​,c1​,...,cm−1​。根据序列 ccc,我们可以生成一个无限长的序列 bbb,使得 bi=ci%mb_i=c_{i\%m}bi​=ci%m​。你需要保证序列 bbb 满足:任意连续 aia_iai​ 个数中,必有一个值为 iii。

你可以决定 mmm 的取值,试求序列 ccc。

2022牛客暑期多校训练营训练日志相关推荐

  1. “蔚来杯“2022牛客暑期多校训练营7 L Maximum Range(强连通缩点+网络流输出方案)

    "蔚来杯"2022牛客暑期多校训练营7 L Maximum Range(强连通缩点+网络流输出方案) 题意 找一个环 上面的边权 极差最大 并输出 点 思路 我们先强联通缩点 统计 ...

  2. “蔚来杯“2022牛客暑期多校训练营1

    "蔚来杯"2022牛客暑期多校训练营1 C Grab the Seat! D Mocha and Railgun 题意: 给定一个圆环,中心为(0, 0).给定T个查询,每次给定环 ...

  3. “蔚来杯“2022牛客暑期多校训练营9 补题题解(A、B、G、E)

    "蔚来杯"2022牛客暑期多校训练营9 A Car Show B Two Frogs G Magic Spells E Longest Increasing Subsequence ...

  4. “蔚来杯“2022牛客暑期多校训练营6

    "蔚来杯"2022牛客暑期多校训练营6 [题目链接]("蔚来杯"2022牛客暑期多校训练营6_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛 ...

  5. 2022牛客暑期多校训练营3 个人题解

    title :2022牛客暑期多校训练营3 题解 date : 2022-8-16 tags : ACM,练习记录 author : Linno 2022牛客暑期多校训练营3 题解 题目链接 :htt ...

  6. “蔚来杯“2022牛客暑期多校训练营10,签到题HFIE

    题号 标题 已通过代码 通过率 团队的状态 A Everlasting Transeunt 点击查看 6/42 B Fall Guys-Perfect Match 点击查看 6/115 C Magic ...

  7. 2022牛客暑期多校训练营1(总结+补题)

    总结: 今天是暑假的第一把多校,开局我找到了签到题,虽然思路很快就出来了但是因为特判的问题wa了两发才过,罚时++(每次打比赛做签到题的时候都因为太急没有思考好就交导致1-3发的罚时,下次宁愿迟10分 ...

  8. “蔚来杯“2022牛客暑期多校训练营8

    Equivalence in Connectivity 前置知识点如下: 1. 并查集哈希 2. 可撤销并查集 3. 线段树分治 #include<bits/stdc++.h> using ...

  9. “蔚来杯“2022牛客暑期多校训练营10补题

    H  Wheel of Fortune 题意 有两个人在打炉石,一方转动了尤格萨隆的命运之轮触发了炎爆选项.双方英雄的血量分别为A和B,双方场面的血量分别为ai和bi,问A获胜的概率. 思路 将代码分 ...

最新文章

  1. 【国内首家】第一个基于语音生成实时知识图谱的系统来啦!!!
  2. 大数据标签获取处理步骤_大数据处理分为哪些步骤
  3. Docker 实战教程之从入门到提高(二)
  4. qq html消息,类似于QQ新消息提醒-前端
  5. oracle表数据如何恢复,ORACLE如何恢复被delete的表数据
  6. 用 Webpack 解决应用性能问题
  7. 第 0 章 阳哥MySQL高级
  8. Java 经典面试题 —— 性能与安全
  9. 体验WebEx网络会议
  10. 人工智能视频教程下载
  11. 2018年TI杯大学生电子设计竞赛题C-无线充电电动小车 题目加答案,非常详细
  12. cmyk列印颜色_列印
  13. 简易购买电影票系统(Java)
  14. ios版基于微软azure的文字转语音工具
  15. Python教程: ‘==‘ 与‘is‘ 以及它们背后的小秘密
  16. Mac使用Aria2下载百度网盘,突破下载限速的方法教程
  17. 魔兽争霸3的MapHack制作教程(一)显示敌对单位
  18. 安徽科技学院 信网学院网络文化节 张乐
  19. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A
  20. 图像测量技术读书笔记

热门文章

  1. 刷爆leetcode
  2. Datawhale 零基础入门数据挖掘心跳信号分类学习反馈03
  3. 《Head First HTML与CSS》笔记 ——1 Web语言
  4. Pycharm安装与配置教程
  5. 我的画作(在photoshop里面画的)
  6. python爬取新浪微博热门话题保存到excel等文件
  7. 极光推送零基础极速上手开发指南,快速搭建后台推送服务
  8. fedora14安装中标普华office成功
  9. Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba (Application)
  10. MATLAB栅格法地图环境