csp-s模拟92

T1:
  容易发现每个数是独立的
  实际上是要求\(ax+by=c\)的解中\(|x|+|y|\)的最小值
  大佬们都是分情况讨论直接算出最小值
  而蒟蒻我不会算,所以就用了一个诡异的方法:
  先简单的取模找到接近最小值的地方,容易发现\(|x|+|y|\)大概是个单谷的函数
  所以可以暴力左右移动xy找到谷底
 
T2:
  考虑按照a排序,设计\(f_i\)表示考虑前i个数对且选了第i个数对的最大权值和
  首先容易想到转移:\(f_i=max_{a_j \leq b_i} \{ f_j \}+w_i\)
 
  发现样例都过不了,考虑哪里少算了
  考虑无法转移到i的一段中有哪些也可以加入序列
  发现若点k满足\(a_k\geq b_i \&\& b_k \geq a_i\)
  那么点k就可以随便排在i的后面,且不会影响序列的\(max \{ a \}\)
 
  那么问题就转换为:
  一个序列,每个点都有两个值\(key,val\),如何快速求一段区间中$\sum_{key_i \geq C} val_i $
  主席树即可
 
T3:
  考试时想到二进制拆分跑多源最短路,但复杂度好像不太对
  实际上只需要跑一遍dijkstra多源最短路,然后记录每个点的最短路是由哪个特殊点拓展的
  最后枚举每条边用两端点的信息更新答案即可

猜你喜欢

转载自www.cnblogs.com/Gkeng/p/11838871.html