gym训练记录

[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] 假设$a$最大,显然$b$个上面的和$c$个右面的只会产生最多$bc$个正面的,所以只要$a\leq bc$有解。如果$a<b+c-1$,那么就不断构造单个,把$a,b,c$减去$1$,直到大于等于为止。

[problem E] 随便加加减减

[problem F]

[problem G] 首先二分答案,把问题变成计数问题。先把$b_i$,$c_i$减去$a_i$,把结果分成两类:两个区间不相交的情况,两个代价是独立的,直接扫描左边的左端点,维护右边的左端点,在线段树上二分右边的即可;两个区间相交的情况,假设相交区域为$[x,y]$,那么代价就是$f_{x,y}=sum_{b[y-r+1,x-1]}+sum_{c[x,y]}+sum_{b[y+1,x+r-1]}$,可以发现$f_{x,y+1}-f_{x,y}=c_{y+1}-b_{y+1}-b_{y-r+1}$,数值与x无关,这样问题就变成:插入删除、给所有数值加一个数、找几个数比$k$小。那么可以利用一个变量维护当前线段树中所有数值加上的数字,查询直接二分即可。复杂度$O(n\log n\log ANS)-O(n)$

[problem H]

[problem I] 拿第二列中的数字把第一列的数字全部问一遍,就可以把第一列分成两部分,且可以知道当前的数值。假设已经问了$k$次,即第一列已经分成了$k+1$段,我们可以首先二分出来$o_{k+1}$属于哪一段,然后暴力分块,二分的时候只要比较段内的一个数字,然后最后在最后一个小于的段和第一个大于的段中找就行了,这样总询问次数是$O(n\log n)$的,维护分段的复杂度可以$O(n^2)$。

[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)$

 

cerc 17

[problem A]

[problem B]

[problem C]

[problem D] 

[problem E]

[problem F]

[problem G]

[problem H]

[problem I]

[problem J]

[problem K]

[problem L]

 

转载于:https://www.cnblogs.com/rqgao2014/p/8034390.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值