2016-5-24模拟测试

  • T1

    • description
      给出一个\(n(\leqslant 200)\)个节点\(m(\leqslant 40000)\)的图,现在请你删除一些边,使得每个点最多只有一条入边和一条出边,并且使删掉的边的权值和最小。
    • solution
      将每个点拆成出点和入点两个点,建立费用流模型,跑最大费用流。
      注意是最大费用流而不是最大流下的最大费用,即使去除了负费用的边,本质也没有改变。
  • T2

    • description
      类似bzoj4561
    • notice
      第一次写这道题是通过了的,其中有几个问题需要注意。
      每次加入圆弧时是两端,当curx取到端点时两个的值是相同的,如果直接算y坐标会被视为相同的插不进去。
      于是可以再加入第二关键字,或者使用multiset。
      还有一个方法就是使上半弧向上偏移eps下半弧向下偏移eps,这样key值就不同了。
      bzoj4561我就是这么写的eps取得1e-5
      这次重新写了一遍,竟然WA完了。
      赛后调试的时候发现竟然把eps的类型给成了int,改成double之后通过了测试。
      然而我的g++是4.7.2的,用4.8.1的g++测试竟然还是WA。
      我适当调大eps后通过了测试,因为我是在sqrt()函数里+eps的,导致出现了精度问题,上下圆弧被算作相同的而只加入了一个。
      即使是这样,在删除的时候是会暴露出问题的,如果
assert(s.find(up) != s.end());
s.erase(up);
assert(s.find(down) != s.end());
s.erase(down);

是会检查出错的。
然而我一时偷懒了,写成了

assert(s.find(up) != s.end());
assert(s.find(down) != s.end());
s.erase(up);
s.erase(down);

就没有查出错误

  • T3
    • description
      60个物品,物品权值\(a_i \leqslant 10^8\),10个询问,询问能否凑出\(s \leqslant 10^9\)
    • solution
      这题标程加了一些剪枝通过了所有的测试数据,然而下来随手被卡T。
      lcr手写bitset+手动开O2优化通过了所有的测试数据。
      我用meet in the middle 枚举前20个最大的,后面的用bitset,抵着时限开了\(3.5 \times 10 ^ 8\)的bitset也通过了所有的测试数据。
      顺便get了手写bitset,加入了《板》。
posted @ 2016-05-24 23:26  Showson  阅读(170)  评论(0编辑  收藏  举报