XJ20夏令营做题记录(长期更新)

7.2

CF1140E

题意:给你一个数组要给是-1的填上数,使得没有奇数长度的回文串,问方案数

思路:可以简化成没有长度为3的回文串,所以我们把奇数偶数位分开,要满足每个数组不能有连续相同的值

用$dp[i][2]$表示中间有$i$个-1,两端是否数值相同,转移即可,注意边界和特殊情况

Aizu_ALDS1_5_C

题意:分形图求每个点坐标

思路:计算几何要补补。。递归模拟即可

SHOI2018汉诺塔

题意:自己看

思路:从平常的汉诺塔出发,$f[i]=f[i-1]*2+1$,是一个线性递推式,打表找一下规律,发现不同优先级下有关$n$都是一个线性递推式

所以用dfs求出$f[1]$,$f[2]$,$f[3]$,通过三项即可求出线性递推式的系数和常量

(留坑补DP正解)

CF97B

题意:在平面上的点集中加入若干个点,使得任意两点在一条平行于x/y轴的直线上或这两点围成的矩形上或内部有其他点

思路:发现给你$n<=1e4$而最多可以输出$2e5$个点,所以猜出加的点应该是log关系,所以想到分治

按照要求对于每一层分治,都可以加该循环内点数个数个点,所以我们以$Point[mid].x$为轴,其他点的$y$值都“拍到”该轴上,可以发现这样左右两边任意点对都可以满足要求

CF273C

题意:有n匹马,每匹马最多有3个敌人,把马划分为2个集合,使得每匹马在该集合中最多只有1个敌人,若不行输出-1

思路:迷惑复杂度过了?? 本人思路很暴力:因为每匹马最多只有3个敌人,所以只对于该匹马,两个集合中一定有1个是合法的,然后手摸了好几组感觉没有-1的情况

先把所有马放在一个集合中,然后爆搜每一匹马,如果这匹马现在不符合,就把它换边,那么这匹马肯定符合,然后去搜被换边他影响的点,如果又不符合了就继续变

可以这样理解:如果这匹马换边了导致换边后在一个集合的敌人(最多1个,且如果已经被确定过)不满足,那么该敌人会换到另一边,可能又会换一个回来(以此类推),但是无论怎样该点在这个集合的敌人数不会超过2,所以在本轮循环中不会再次不符合。这样就可以解释为什么不会出现死循环而-1了

然后循环n轮使得使得每匹马都被确定过,就是最终答案

(留坑证明复杂度(可能是边数很少,图非常稀疏))

POJ1854

题意:给一个字符串,求相邻交换最少次数,使得字符串变成一个回文串

思路:用贪心(没想出来QAQ),考虑开头结尾相对应的位置用什么字母去填,就暴力看哪个字母移到当前开头结尾的步数最少,那就移过去

如果步数最少的两个点就近匹配而没有到开头结尾,那么步数较远的点填开头结尾付出的代价一定比你最近匹配节省的步数多(或等于),所以贪心正确(好抽象。。)

(两组数据理解:..ba....ab....;ab....a.....b   b到开头结尾然后a匹配的时间一定小于等于a万里迢迢匹配然后b就近匹配的距离)

CF264C

题意:在一个序列中挑出一些,挑出的对答案的贡献——若该数与新数列的前一位数值相同,那么$ans+=v[i]*a$否则$ans+=v[i]*b$。$a$,$b$为每次询问所给的常数,求ans最大

很容易搞出n^2的DP:$dp[i]=max(dp[j])+a*v[i]$($c[i]==c[j]$)

          $dp[i]=max(dp[j])+b*b[i]$ ($c[i]!=c[j]$)

然后因为只要求前面两种情况的dp最大值,而且c[i]不大,很容易想到权值线段树,维护每一数值的最大dp值,然后询问改点最大和剩下点最大

但是本题$nlog(n)$过不了。所以有更简单的——直接维护每一个数值dp最大值和总体dp最大和次大值(保证贡献dp最大和次大值的来源的c不同)

然后如果最大值的c就是c[i],那么$c[i]!=c[j]$的最大dp值就是总体dp次大值,就可以线性$O(n)$更新了

(今日逗比:竟然忘记平面最近点对怎么写,筛质因数居然写了个O(n)复杂度。。)

7.3

CF830A

题意:n个人k个钥匙,每个人要分别拿到一个钥匙再回到点p求路程最长的那个人路程最小值

思路:二分+贪心,先二分答案,对于p左边的人,尽量往左边取,右边的尽量往右边取,这样的贪心可以保证如果该二分的答案成立,那么一定可以枚举出方案

还有一种神奇的贪心:可以发现对于取的钥匙一定是坐标连续n个,所以直接暴力枚举区间就可以

(还有一种DP?$dp[i][j]$表示前$i$个人选到前$j$把钥匙$dp[i][j]=min(dp[i][j-1],max(dp[i-1][j-1],dis[i][j]))$)

CF1335F

题意:给一个矩阵,上面有ULRDULRD四种指向,同时这个矩阵的每个元素还有黑或白两种属性,在该格中则下一秒就到了指向的那个格子,现在在矩阵中放机器人,如果两个机器人在若干秒后相撞了,则该摆放不合法,求最大合法摆放个数和以之为前提最多有多少黑格

思路:对于机器人在每个点,可以发现至多走$n*m$步就会陷入环中(一直走一个循环),所以让每个点走这么多步,在一起的一定在一起,不在一起的一定不在一起,倍增实现

(MYY大佬做法:考虑每个点出度为1,所以一定是一个基环树森林,反向连边,然后对于换射出的点计算dep,即为它进入环时的步数,%环长度就可以知道环上哪个点和它相交)

(为什么string不pushback直接赋值会RE啊QAQ)

CF932D

题意:刚开始只有1点权为0。现有两种操作:

1 u v:以u为父亲,加一个权值为v的新节点

2 u x:以u为端点,看u上方的不严格上升子序列(能选必须选,直到不能选),满足序列点权和小于等于x

思路:调了3个小时。。其实就是用倍增维护权值第2^k个大于该点的父亲,然后再加一些数组就可以了,然后我被赋值顺序搞反还有强制在线写错卡了n久(因为用离线拍导致拍了一个多小时还没拍出来)

然后就创造了CF WA24次的辉煌战绩

CF489E

题意:这个好烦自己看

思路:0/1分数规划,直接二分枚举答案,因为分子不是定值而是会有前面不同决策的影响,所以用DP,把枚举的ans带进DP使得$DP[n]<=0$就说明ans合法

LOJ2692

题意:中文题面自己看(发现自己好懒QAQ

思路:肯定想到二分枚举答案,然后就是在确定相邻最大差值时看最小操作步数是否小于等于m

先不考虑$a[k]=0$,我们考虑对于$a[i]$的限制,可能来自于左边来自于右边,所以左边右边各更新一次(左边$dp[i]=min(dp[i],dp[i-1]+mid)$,右边同理)

不可能出现i左边的把i右边的更新了然后右边的拿这个值更新了,不然左边的直接更新i就可以了

然后考虑在已经满足的数组上砍一个0,可以发现砍了0以后需要改变的区间是一个连续的[l,r](外面的如果有需要砍的,那么里面一定都需要砍(相邻最大差为mid),如果里面有不需要砍的,那么外面一定也不需要砍),且l,r递增,所以可以用指针。

然后就区间和减去$dp[i]$再减去两个三角形(等差数列)就是把该点砍掉的答案,取每个点最小值

今天真的wei。。什么题都调不出来。。还要补3道题:LOJ3265 CF1237D AtCoder - agc002_d  还有打崩的CF比赛E2,还有yz6205C题题解  周末补补吧)

7.10

没保存把所有今天写的都删了。。人都傻了。。

这个礼拜挺颓的,wenyuan住校,寝室没电脑,机房里一直在补题(我太弱惹QAQ。。)所以博客一直咕咕咕,今天就补一下这周难度较大的题目

(留坑提醒自己补题,还有模板搬运一直说要做结果一直没做。。完了完了APIO要凉

CF1214F

题意:长度为$m$的环上有$n$个人$n$个办公室,给每个人分配一个办公室,使得每个人各自到办公室的距离总和最小

思路:可以联想一道之前一道Office的题,正解二分其实可以贪心。本题也可以借鉴这样的思路:当环为链时,我们容易发现人一定和与其对应rank的office对应,所以我们破环为链,把office复制一份,找到最优解即可。

朴素算法复杂度n^2,有一种比较新颖的方法——在答案上进行差分(即不同位置所对应的答案),考虑人的坐标$a[i]$,它对$ans$的影响是这样的:有一些是$abs(a[i]-b[j])$,有一些是$m-abs(a[i]-b[j])$,把绝对值拆开总共有四段贡献,有正有负,二分枚举区间即可,$b[j],m$同理,$m$可以放进去一起算

上面那种方法真的细节超多QAQ。。既然我们已经考虑到把m一起讨论,为什么不把m直接放进b数组呢:把b数组赋值成三分,前面那份是$b[i]-m$,后面那份是$b[i]+m$,再进行差分——因为$a,b$都有序,所以直接指针维护$a[i],b[j]$在枚举时对于不同ans的正负值贡献,这样写非常方便

CF1045B

题意:一个很大的集合(m<=2e9个数,为0~m-1的排列),给你A集合(2e5个),剩下的都是B集合,A,B中元素分别取一个求和取模m,问无法达到的0~m-1的数有几个,并且输出

思路:我们考虑如果$k$无法被取到,对于$a[1]$,和它组成和(取模)为$k$的数一定在A集合中(易得每个数只有一个对应是和为$k$),那么对于$a[2]$同理,所以如果$a[1]$对应$a[i]$,那么$a[2]$必须对应$a[i-1]$,同理,$a[i+1]$必须对应$a[n]$……(它们的和为$m+k$)所以我们设T数组为$a[i]-a[i-1]$,发现T必须为两端回文串,所以我们枚举$a[1]$对应的$a[i]$,然后用manacher或者字符串哈希判断(小细节$a[1]$要再次枚举,因为B集合中无法找到$a[1]$与$a[1]$匹配)

CF1168D

题意:这个好烦看链接

思路:题目中的$f$其实有提示作用:对于满足要求的树,当且仅当满足条件对于每一个节点$u$,它的子树满足$sum dp(u,c)leq dis[u]$,其中$dp(u,c)$表示u子树不同到叶子的路径上里c字母已经出现的最大个数,$dis[u]$表示到叶子结点的距离,这个很容易证明。

然后我们发现没有用上二叉树这个条件——有一个性质,对于一棵叶子结点深度相同的二叉树(不相同不可能满足),在把所有儿子只有1个的点缩点以后,深度一定小于$sqrt{n}$。所以我们在路径压缩以后可以直接对于每一次修改暴力从修改点到根依次修改DP值(没有学过DDP直说。。),在代码实现方面,有一个细节:可以把边上的颜色全部压到儿子节点,更为方便,且由于无法承受26次枚举,每次修改只改要求颜色即可

洛谷P4352

题意:中文题面自己看

思路:安利一波官方题解感觉讲了也不会写??)在画了轮廓线以后,可以发现每次只有有限组向日葵正在缩短距离,而缩短距离的步数由左右照的天数有关——我们分别判断对于两个相邻的向日葵,向左,向右照是否距离变短,然后用三个邻接表维护:左边照到num会合并,右边找到num会合并,不管左右照到num会合并,对应不同的情况塞到不同的邻接表中。当枚举的时间达到num时,把这两个向日葵合并(合并之后其实就是一个了),然后再和左右计算一下什么时候会合并,并且塞到邻接表中,因为在枚举天数时每个向日葵最多被合并一次,所以复杂度无比正确~~~(代码细节超多)

------------恢复内容开始------------

7.2

CF1140E

题意:给你一个数组要给是-1的填上数,使得没有奇数长度的回文串,问方案数

思路:可以简化成没有长度为3的回文串,所以我们把奇数偶数位分开,要满足每个数组不能有连续相同的值

用$dp[i][2]$表示中间有$i$个-1,两端是否数值相同,转移即可,注意边界和特殊情况

Aizu_ALDS1_5_C

题意:分形图求每个点坐标

思路:计算几何要补补。。递归模拟即可

SHOI2018汉诺塔

题意:自己看

思路:从平常的汉诺塔出发,$f[i]=f[i-1]*2+1$,是一个线性递推式,打表找一下规律,发现不同优先级下有关$n$都是一个线性递推式

所以用dfs求出$f[1]$,$f[2]$,$f[3]$,通过三项即可求出线性递推式的系数和常量

(留坑补DP正解)

CF97B

题意:在平面上的点集中加入若干个点,使得任意两点在一条平行于x/y轴的直线上或这两点围成的矩形上或内部有其他点

思路:发现给你$n<=1e4$而最多可以输出$2e5$个点,所以猜出加的点应该是log关系,所以想到分治

按照要求对于每一层分治,都可以加该循环内点数个数个点,所以我们以$Point[mid].x$为轴,其他点的$y$值都“拍到”该轴上,可以发现这样左右两边任意点对都可以满足要求

CF273C

题意:有n匹马,每匹马最多有3个敌人,把马划分为2个集合,使得每匹马在该集合中最多只有1个敌人,若不行输出-1

思路:迷惑复杂度过了?? 本人思路很暴力:因为每匹马最多只有3个敌人,所以只对于该匹马,两个集合中一定有1个是合法的,然后手摸了好几组感觉没有-1的情况

先把所有马放在一个集合中,然后爆搜每一匹马,如果这匹马现在不符合,就把它换边,那么这匹马肯定符合,然后去搜被换边他影响的点,如果又不符合了就继续变

可以这样理解:如果这匹马换边了导致换边后在一个集合的敌人(最多1个,且如果已经被确定过)不满足,那么该敌人会换到另一边,可能又会换一个回来(以此类推),但是无论怎样该点在这个集合的敌人数不会超过2,所以在本轮循环中不会再次不符合。这样就可以解释为什么不会出现死循环而-1了

然后循环n轮使得使得每匹马都被确定过,就是最终答案

(留坑证明复杂度(可能是边数很少,图非常稀疏))

POJ1854

题意:给一个字符串,求相邻交换最少次数,使得字符串变成一个回文串

思路:用贪心(没想出来QAQ),考虑开头结尾相对应的位置用什么字母去填,就暴力看哪个字母移到当前开头结尾的步数最少,那就移过去

如果步数最少的两个点就近匹配而没有到开头结尾,那么步数较远的点填开头结尾付出的代价一定比你最近匹配节省的步数多(或等于),所以贪心正确(好抽象。。)

(两组数据理解:..ba....ab....;ab....a.....b   b到开头结尾然后a匹配的时间一定小于等于a万里迢迢匹配然后b就近匹配的距离)

CF264C

题意:在一个序列中挑出一些,挑出的对答案的贡献——若该数与新数列的前一位数值相同,那么$ans+=v[i]*a$否则$ans+=v[i]*b$。$a$,$b$为每次询问所给的常数,求ans最大

很容易搞出n^2的DP:$dp[i]=max(dp[j])+a*v[i]$($c[i]==c[j]$)

          $dp[i]=max(dp[j])+b*b[i]$ ($c[i]!=c[j]$)

然后因为只要求前面两种情况的dp最大值,而且c[i]不大,很容易想到权值线段树,维护每一数值的最大dp值,然后询问改点最大和剩下点最大

但是本题$nlog(n)$过不了。所以有更简单的——直接维护每一个数值dp最大值和总体dp最大和次大值(保证贡献dp最大和次大值的来源的c不同)

然后如果最大值的c就是c[i],那么$c[i]!=c[j]$的最大dp值就是总体dp次大值,就可以线性$O(n)$更新了

(今日逗比:竟然忘记平面最近点对怎么写,筛质因数居然写了个O(n)复杂度。。)

7.3

CF830A

题意:n个人k个钥匙,每个人要分别拿到一个钥匙再回到点p求路程最长的那个人路程最小值

思路:二分+贪心,先二分答案,对于p左边的人,尽量往左边取,右边的尽量往右边取,这样的贪心可以保证如果该二分的答案成立,那么一定可以枚举出方案

还有一种神奇的贪心:可以发现对于取的钥匙一定是坐标连续n个,所以直接暴力枚举区间就可以

(还有一种DP?$dp[i][j]$表示前$i$个人选到前$j$把钥匙$dp[i][j]=min(dp[i][j-1],max(dp[i-1][j-1],dis[i][j]))$)

CF1335F

题意:给一个矩阵,上面有ULRDULRD四种指向,同时这个矩阵的每个元素还有黑或白两种属性,在该格中则下一秒就到了指向的那个格子,现在在矩阵中放机器人,如果两个机器人在若干秒后相撞了,则该摆放不合法,求最大合法摆放个数和以之为前提最多有多少黑格

思路:对于机器人在每个点,可以发现至多走$n*m$步就会陷入环中(一直走一个循环),所以让每个点走这么多步,在一起的一定在一起,不在一起的一定不在一起,倍增实现

(MYY大佬做法:考虑每个点出度为1,所以一定是一个基环树森林,反向连边,然后对于换射出的点计算dep,即为它进入环时的步数,%环长度就可以知道环上哪个点和它相交)

(为什么string不pushback直接赋值会RE啊QAQ)

CF932D

题意:刚开始只有1点权为0。现有两种操作:

1 u v:以u为父亲,加一个权值为v的新节点

2 u x:以u为端点,看u上方的不严格上升子序列(能选必须选,直到不能选),满足序列点权和小于等于x

思路:调了3个小时。。其实就是用倍增维护权值第2^k个大于该点的父亲,然后再加一些数组就可以了,然后我被赋值顺序搞反还有强制在线写错卡了n久(因为用离线拍导致拍了一个多小时还没拍出来)

然后就创造了CF WA24次的辉煌战绩

CF489E

题意:这个好烦自己看

思路:0/1分数规划,直接二分枚举答案,因为分子不是定值而是会有前面不同决策的影响,所以用DP,把枚举的ans带进DP使得$DP[n]<=0$就说明ans合法

LOJ2692

题意:中文题面自己看(发现自己好懒QAQ

思路:肯定想到二分枚举答案,然后就是在确定相邻最大差值时看最小操作步数是否小于等于m

先不考虑$a[k]=0$,我们考虑对于$a[i]$的限制,可能来自于左边来自于右边,所以左边右边各更新一次(左边$dp[i]=min(dp[i],dp[i-1]+mid)$,右边同理)

不可能出现i左边的把i右边的更新了然后右边的拿这个值更新了,不然左边的直接更新i就可以了

然后考虑在已经满足的数组上砍一个0,可以发现砍了0以后需要改变的区间是一个连续的[l,r](外面的如果有需要砍的,那么里面一定都需要砍(相邻最大差为mid),如果里面有不需要砍的,那么外面一定也不需要砍),且l,r递增,所以可以用指针。

然后就区间和减去$dp[i]$再减去两个三角形(等差数列)就是把该点砍掉的答案,取每个点最小值

今天真的wei。。什么题都调不出来。。还要补3道题:LOJ3265 CF1237D AtCoder - agc002_d  还有打崩的CF比赛E2,还有yz6205C题题解  周末补补吧)

7.10

没保存把所有今天写的都删了。。人都傻了。。

这个礼拜挺颓的,wenyuan住校,寝室没电脑,机房里一直在补题(我太弱惹QAQ。。)所以博客一直咕咕咕,今天就补一下这周难度较大的题目

(留坑提醒自己补题,还有模板搬运一直说要做结果一直没做。。完了完了APIO要凉

CF1214F

题意:长度为$m$的环上有$n$个人$n$个办公室,给每个人分配一个办公室,使得每个人各自到办公室的距离总和最小

思路:可以联想一道之前一道Office的题,正解二分其实可以贪心。本题也可以借鉴这样的思路:当环为链时,我们容易发现人一定和与其对应rank的office对应,所以我们破环为链,把office复制一份,找到最优解即可。

朴素算法复杂度n^2,有一种比较新颖的方法——在答案上进行差分(即不同位置所对应的答案),考虑人的坐标$a[i]$,它对$ans$的影响是这样的:有一些是$abs(a[i]-b[j])$,有一些是$m-abs(a[i]-b[j])$,把绝对值拆开总共有四段贡献,有正有负,二分枚举区间即可,$b[j],m$同理,$m$可以放进去一起算

上面那种方法真的细节超多QAQ。。既然我们已经考虑到把m一起讨论,为什么不把m直接放进b数组呢:把b数组赋值成三分,前面那份是$b[i]-m$,后面那份是$b[i]+m$,再进行差分——因为$a,b$都有序,所以直接指针维护$a[i],b[j]$在枚举时对于不同ans的正负值贡献,这样写非常方便

CF1045B

题意:一个很大的集合(m<=2e9个数,为0~m-1的排列),给你A集合(2e5个),剩下的都是B集合,A,B中元素分别取一个求和取模m,问无法达到的0~m-1的数有几个,并且输出

思路:我们考虑如果$k$无法被取到,对于$a[1]$,和它组成和(取模)为$k$的数一定在A集合中(易得每个数只有一个对应是和为$k$),那么对于$a[2]$同理,所以如果$a[1]$对应$a[i]$,那么$a[2]$必须对应$a[i-1]$,同理,$a[i+1]$必须对应$a[n]$……(它们的和为$m+k$)所以我们设T数组为$a[i]-a[i-1]$,发现T必须为两端回文串,所以我们枚举$a[1]$对应的$a[i]$,然后用manacher或者字符串哈希判断(小细节$a[1]$要再次枚举,因为B集合中无法找到$a[1]$与$a[1]$匹配)

CF1168D

题意:这个好烦看链接

思路:题目中的$f$其实有提示作用:对于满足要求的树,当且仅当满足条件对于每一个节点$u$,它的子树满足$sum dp(u,c)leq dis[u]$,其中$dp(u,c)$表示u子树不同到叶子的路径上里c字母已经出现的最大个数,$dis[u]$表示到叶子结点的距离,这个很容易证明。

然后我们发现没有用上二叉树这个条件——有一个性质,对于一棵叶子结点深度相同的二叉树(不相同不可能满足),在把所有儿子只有1个的点缩点以后,深度一定小于$sqrt{n}$。所以我们在路径压缩以后可以直接对于每一次修改暴力从修改点到根依次修改DP值(没有学过DDP直说。。),在代码实现方面,有一个细节:可以把边上的颜色全部压到儿子节点,更为方便,且由于无法承受26次枚举,每次修改只改要求颜色即可

洛谷P4352

题意:中文题面自己看

思路:安利一波官方题解感觉讲了也不会写??)在画了轮廓线以后,可以发现每次只有有限组向日葵正在缩短距离,而缩短距离的步数由左右照的天数有关——我们分别判断对于两个相邻的向日葵,向左,向右照是否距离变短,然后用三个邻接表维护:左边照到num会合并,右边找到num会合并,不管左右照到num会合并,对应不同的情况塞到不同的邻接表中。当枚举的时间达到num时,把这两个向日葵合并(合并之后其实就是一个了),然后再和左右计算一下什么时候会合并,并且塞到邻接表中,因为在枚举天数时每个向日葵最多被合并一次,所以复杂度无比正确~~~(代码细节超多)

7.15

ZJ_ACM_DAY1_E

我们可以先对于区间序列进行去重,因为大的区间一定比小的区间更优,然后对于每次的权值序列进行排序,用指针思考,可以发现假设我们把一段覆盖相同权值区间的区间序列视为一种,那么最多只有$k$种,所以我们可以二分每一种在区间序列的左端点和右端点(先指针枚举到左端点,二分搞出权值的区间,然后再拿权值区间找出右端点),对于每一种,可以发现除了那个$r[j]-l[j]$不一样其它都相同,所以我们对于$r[j]-l[j]$进行RMQ即可(代码见作业部落)

ZJ_ACM_DAY3_E

 

题意大概就是给你一棵树,以树的每一个节点为根,求各个点到根的路径上比该点权值大的点的个数和,对于每一个根的答案求和

思路:很容易想到一个转移表达式:考虑每一个节点对于所有情况的贡献,为:$ans[i]=sum_{xin son[i]}(n-sz[x])*sum_{yin subtree[x]}[val[y]<val[x]]+sum_{y otin subtree[i]}*sz[i]$

然后想一个数据结构去维护这玩意:第一反应是在dfs序上维护一颗主席树,实际也是可行的。还有一种更为高端的做法:每次按照权值塞进树状数组并且统计答案,这样不用建权值线段树而是直接普通树状数组维护dfs序上区间sum即可

7.19

AGC20-C

题意:给你两千个数,共有$2^{n}-1$个非空集合组成的和,问这些和的中位数是什么

思路:AT的题真是奥妙重重。。假设总和为$sum$,其中的一个子集的和为$t$,那么一定存在补集使得$sum-t$存在,且前后个数一定相同,所以中位数一定在$sum/2$这里出现,然后我们就有一个很简单的01背包dp转移,但是发现dp数组只保存了0/1,所以我们可以用高端的bitset优化,这样就可以达到$n^{2}$的复杂度了

ZJ_ACM_DAY4_C

大致题意就是求一个图上给一个给定集合,求每个点到给定集合中第$k$远的点,其中$k<=20$

思路:想到了多人背包。我们考虑如何在dijkstra上跑这个多人背包,把给定集合中的所有点先塞进队里,再出堆操作时,我们考虑这个点的from,建立一个map维护,如果对于节点u,如果这个from还没有被更新过,那么这个一定是最优的来自from的方案,进行扩展,反之continue。如果这个点u已经有超过20个比当前from更优的点,那么也continue,因为超过20不会更新任何点,这样保证每个点只会出队20次

留坑补一堆题

7.20

爆肝数学无法自拔,咕咕咕了

原文地址:https://www.cnblogs.com/Forever-666/p/13227840.html