A.挑战(challenge.cpp)
首先令\(x_i=max(a_i-k,0)\),即破坏第\(i\)个防御区域的代价.
设\(dp_i\)表示从\(1...i\)需要的最小代价,有状态转移方程:\(dp_i=min(dp_j)+x_i\),其中\(i-L\le j\le i-1\).
初始化边界\(dp_0=0,dp_{1...n+1}=inf\).动态规划求出\(dp_{n+1}\)即可.
时间复杂度\(O(n^2)\),可以用ST表/线段树优化到\(O(nlogn)\).
B.乌龟(turtle.cpp)
如果\(n>cnt(T)\),答案为\(Len\)或\(Len-1\),其中\(cnt(T)\)表示\(T\)的个数,\(Len\)表示字符串的长度.
否则,可以动态规划求出要修改哪\(n\)次操作.
但是我不会??
C.代表(delegate.cpp)
二分图匹配.
从源点向每个人容量为\(1\)的边,从每个社团向汇点连容量为\(1\)的边,从每个人向他所参加的社团连边.整张网络的最大流就是答案.
也可以用匈牙利算法进行二分图匹配.
正确性显然.
D.树(tree.cpp)
我对题意的理解似乎有问题.我的做法是先\(O(n)\)建出树,再用\(O(logn)\)的倍增LCA操作回答每个询问,时间复杂度\(O(nlogn)\).需要注意对题目中系数的取模处理.
但是总感觉有什么不对.
原文地址:https://www.cnblogs.com/TaylorSwift13/p/11421073.html
时间: 2024-10-08 12:48:26