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\)贪心得到

E

posted @ 2020-08-13 10:05  Grice  阅读(177)  评论(0编辑  收藏  举报