[upd 12.18] 老年选手也该看看欧洲的acm了,不然以后就再也没有机会了
neerc 17
[problem A] 挺牛逼的结论,与y轴平行的直线最多只会经过$O(\log C)$个点,拿一个线段树维护一下每个x对应哪些圆即可。复杂度$O(n\log n\log C)-O(n)$
[problem B] 对每种图讨论即可
[problem C] 建出一棵dfs树,假设当前与$1$构成强联通的集合为$S$,bfs每次找到一个不在$S$中的点指向$S$中点的边,把不在$S$中的点到根路径加入$S$即可。复杂度$O(n+m)-O(n+m)$
[problem D]
[problem E] 随便匹配匹配
[problem F]
[problem G]
[problem H]
[problem I]
[problem J] 考虑枚举第k大的边的数值x,把小于x的边全部修改为0,跑一边恰好有k个非0边的最短路,这样是O(nm^2)的。考虑转为一般最短路,对于一条路径,如果其非0边的数量大于k,那么显然有更优的方案被别的数值统计,不会影响答案;如果小于,补足k个数值x后也不影响答案。那么把非0的权值减去x,那么最后最短路加上$xk$就是权值$x$的答案,数据会卡spfa。复杂度$O(m^2\log n)-O(m+n)$
[problem K]
[problem L] 按照链的长度从大到小排序,这样就不会出现某个线被后面严格包含。扫一遍整条路径,如果有被搞过的点那么就是NO,否则把一端为路径上点的路径全部取出来,这样问题就变到了数列上:询问是否存在x1<y2,x2<y1,按照左端点排序,那个单调栈维护类似括号序列的东西,去掉右端点小于的区间,检查最后一个区间即可。复杂度$O(n\log n)-O(n\log n)$