2016-5-24模拟测试
-
T1
- description
给出一个\(n(\leqslant 200)\)个节点\(m(\leqslant 40000)\)的图,现在请你删除一些边,使得每个点最多只有一条入边和一条出边,并且使删掉的边的权值和最小。 - solution
将每个点拆成出点和入点两个点,建立费用流模型,跑最大费用流。
注意是最大费用流而不是最大流下的最大费用,即使去除了负费用的边,本质也没有改变。
- description
-
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的,导致出现了精度问题,上下圆弧被算作相同的而只加入了一个。
即使是这样,在删除的时候是会暴露出问题的,如果
- description
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,加入了《板》。
- description
原文出处http://www.cnblogs.com/showson/