Codeforces Round 286

Codeforces Round 286

https://codeforces.com/contest/505

A

给出一个长度为n的字符串。

询问是否可以插入一个小写英文字母使其成为回文

n<10

直接暴力

B

给出一个n个点m条边的无向图。

每条边有一个颜色ci。

q次询问,每次询问两个数ui和vi

求满足以下条件的颜色个数,该颜色的边直接或间接连接ui和vi

n<=100 m<=100 q<=100

做法:

暴力枚举颜色,用并查集维护一下连通性。

C

n颗宝石,第i颗宝石位于pi岛上。

一共30000个岛。

一开始我在0号岛。

首先,我从0号岛跳到d号岛。

之后,设L为上次跳跃的距离,下一次可以跳L-1,L或L+1,但不能不跳。

询问可以收集的最大数量的宝石。

n,d<=30000

做法:

一个很妙的DP Trick。

定义方程\(dp[i][j]\)表示到第\(i\)步,步伐长度变化j的能收集到的最大宝石数量。

然后根据\(dp[i][j]\)这个值去往后更新。

根据等差数列求和的性质,这个j不会太大,大概是-300到300。

D

n个城市。

有m对城市是重要的。

我计划建造单向边,使得对于每一对城市(ai,bi),都可以通过单向边从ai到bi。

找出需要建造的最少数量的单向边方案,打印最少数量即可。

n,m<=100000

做法:

结论:

不同连通块之间显然不需要边,所以单独考虑每个连通块。

一个连通块内如果没有环,可以根据拓扑序重构成一条链满足题目要求。

一个连通块内如果有环,不管有几个环,都可以通过一个大环来满足要求。

所以答案是n-连通块数量+含环连通块数量。

E

我有n根竹子。

第i根竹子高度位hi米,每天生长ai米。

我每天可以使用魔力k次,每次可以将一根竹子变低p米。不会变成负数,变成0,但不会消失。

现在我有m天,我要最小化m天后最高竹子的高度。

询问m天后最高竹子的最低可能高度。

n<=100000

m<=5000

k<=10

p<=1e9

做法:

二分,m天后最高的竹子为H是否可行。

然后反过来做。

先统一在第m天把所有竹子变成H。

然后每天,所有竹子高度变矮ai,你必须保证所有竹子高度>=0,且m天结束后竹子高度>=hi。

用一个堆维护,当前状态下继续减少高度而不拔高,第m天结束后竹子高度会<hi的竹子,一直减少高度,多少天后的高度会<0。

每次取出剩余天数最少的竹子,拔高即可。

如果无论怎么拔高还是会<0的竹子,直接返回错误。

上一篇:【Axure原型图】—— 4. Tab Control(选项卡)


下一篇:dubbo底层通信netty,感悟分享