Codeforces Round #664 (Div. 1)(E未做)

A

枚举选择(a_ile m)的个数,然后贪心选择(a_i>m)的部分

B

先写个垃圾做法

对于({c}),每个点有唯一出边,若合法则每个点都在一个简单环内,即每个点的后继节点均不相同
对于(vin 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))

  • (Cle A,Dle B),最小操作为(max(A-C,B-D))
  • (Cge A,Dge B),最小操作为(max(C-A,D-B))
  • (Cle A,Dge B),最小操作为(A-C+D-B)
  • (Cge A,Dle 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_0le Cle y_0,x_1le Dle y_1,x_2le C-Dle 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_ulongrightarrow u)的最小值,(g_u)(ulongrightarrow p_u)的最小值
对于(f_u),可以通过枚举儿子节点有多少个(son_ilongrightarrow u)贪心得到

E

原文地址:https://www.cnblogs.com/Grice/p/13494339.html