Codeforces Round #664 (Div. 1)(E未做)
A
枚举选择\(a_i\le m\)的个数,然后贪心选择\(a_i>m\)的部分
B
先写个垃圾做法
对于\(\{c\}\),每个点有唯一出边,若合法则每个点都在一个简单环内,即每个点的后继节点均不相同
对于\(v\in V\),\((u,v)\in E\),令\(deg_u=k\),有确定的\(c_k\)可以使\((u,v)\)生效,找到\(v\)的生效集合,集合内不能同时出现两个
那么可以找到\(ban_{i,j,i_0,j_0}\),表示不能同时出现\(c_i=i_0,c_j=j_0\)
不过不能两两枚举\((u,v)\in E\),得去重,有个细节是若集合同时存在\(c_i=i_0,c_i=i_0\),不能出现\(c_i=i_0\),得在去重前处理掉
\(O(mlogm+k^2n)\)或\(O(km+k^2n)\),取决于去重的算法
最后爆搜\(\{c\}\),\(O(k!k)\)
\(O(mlogm+k^2n+k!k)\)
官方题解:
合法的充要条件为:对于\(c_i=i0\),可以找到后继集合,\(\{c\}\)的后继集合=\(\{1,2,\cdots,n\}\),可以用hash判断
\(O(km+k!)\)
C
做法跟官方题解不大一样,可能本质是相同的。感觉没有2600的难度...
将B和N的个数描述成二元组\((A,B)\)
对于S\((A,B)\),T\((C,D)\)
- \(C\le A,D\le B\),最小操作为\(max(A-C,B-D)\)
- \(C\ge A,D\ge B\),最小操作为\(max(C-A,D-B)\)
- \(C\le A,D\ge B\),最小操作为\(A-C+D-B\)
- \(C\ge A,D\le B\),最小操作为\(C-A+B-D\)
分开讨论会更复杂,一般化的处理:最小操作未\(max(A-C,B-D,C-A,D-B,A-C+D-B,C-A+B-D)\)
可能可以分段做到线性,但会比较麻烦
我们二分最小操作次数\(mid\),即判断\(max(A-C,B-D,C-A,D-B,A-C+D-B,C-A+B-D)\le mid\)
可以得到\(x_0\le C\le y_0,x_1\le D\le y_1,x_2\le C-D\le y_2\)
可行性很简单判断,有个细节就是\(C,D\)不能同时为\(0\)
D
对于每条边都定向的情况,\(ans=\sum min(in_i,out_i)\cdot t_i\)
对于\((u,v)\in E,h_u=h_v\)的情况要考虑定向的情况
那么对于\((u,v)\in E,h_u=h_v\),图形成了若干个森林,分别考虑
令\(p_u\)为\(u\)的父亲,令\(f_u\)为\(p_u\longrightarrow u\)的最小值,\(g_u\)为\(u\longrightarrow p_u\)的最小值
对于\(f_u\),可以通过枚举儿子节点有多少个\(son_i\longrightarrow u\)贪心得到