Potyczki Algorytmiczne 2011

Trial Round:

Tulips

按题意模拟。

  

Round 1:

Rooks [B]

对于每个没有车的行,随便找一个没有车的列配对。

  

Round 2:

Unlucky [A]

如果w不是k的倍数,那么先考虑从起点带wmodk升水出发怎么处理,然后再依次考虑每次从起点带k升水出发怎么处理。

假设目前已经推进到的右端点是all,算上这次一共要从起点出发t次,那么从all往右推进的这段路将被经过总计2t1次。最优策略是将这次出发带走的水平均分成2t1份,从而得到本次推进的距离,注意距离要和到终点的距离取min

求出推进距离后,乘以经过的次数,就是这段路消耗的水量。

时间复杂度O(wk)

  

Climbing [B]

从左往右贪心,若一段区间能拼上则拼上,通过维护关于最左边数的不等式组的解集来判断。

时间复杂度O(n)

  

Round 3:

Pedestrian Crossing [B]

在模K意义下做,每个白色段会禁掉起点位置的一个区间,注意这里区间端点不会被禁,所以引入0.5坐标。最后检查是否[0,K0.5]都被禁了即可。

时间复杂度O(nlogn)

  

Round 4:

Fuel [B]

找到一条树直径,令直径上的点代价为1,剩下的点代价为2,注意起点代价为0,然后贪心选点即可。

时间复杂度O(n)

  

Round 5:

Declining Sequences [B]

求出f[i][j]表示有多少以j为起点长度为i的递减序列。

对于一个有解的询问,从第1层一直找到第m层,每层需要找到权值小于某数,且下标大于某数的部分里从左往右第k个方案所在的下标。

按照权值扫描线后,线段树上维护区间f值的和,然后在线段树上二分即可。

时间复杂度O(nmlogn)

  

Double Factorial [B]

1!×2!×3!××n!里质因子5的个数即

(151+251++n51)+(152+252++n52)++(15k+25k++n5k)

枚举k后推公式即可。

  

Trails [A]

留坑。

 

Vacation [A]

k=2时就是ab的距离。

k=3时,答案上界为24n,对于每个点向三个排列对应位置左右15个位置连负边可以减小答案。建立二分图,使用Dijkstra找增广路求最小费用流。

优化1:

最短路不超过24,可以用桶代替堆,使得每次Dijkstra时间复杂度为O(n+m),其中m=nc

优化2:

Dijkstra求出源点到每个点的最短路后,在最短路图上BFS得到每个点的层数。

沿着最短层进行多路增广,不断BFS多路增广直到无法增广。

那么每次Dijkstra求出的最小花费严格递增,且BFS出来的最小层数严格递增。

沿用Dinic的分析可得每次多路增广次数不超过O(n),所以一共O(cn)次多路增广。

总时间复杂度O(cn(n+m))=O(c2n1.5)

  

Round 6:

Automorphisms [B]

找重心作为根,如果两个重心就拆了中间加个点作为根。

对于每个点,将儿子按hash值分组,对于每组,将答案乘以儿子数的阶乘即可。

  

Kangaroos [A]

两个区间[x1,y1][x2,y2]相交等价于x1y2y1x2

考虑离线,把所有区间看成二维的点建立K-D Tree。

然后从1n依次加入每个区间,每次加入一个区间时,把所有与它相交的询问的值+1,把所有与它不相交的询问的值设为0

在K-D Tree上打标记,最后每个询问的答案为其值的历史最大值,时间复杂度O(nm)

  

Laser Pool [A]

与横线以及竖线的交点个数很容易求,那么只要求出横线竖线交点与运动轨迹的交点数即可。

运动轨迹可以划分成若干条贯穿边界的斜线,对于第一条和最后一条,可以用bitset暴力统计。

对于中间的部分,斜线都是完整的,可以FFT预处理。

时间复杂度O(nlogn+nq32)

  

The Shortest Period [B]

枚举答案长度L,设AB分别为第一个循环节和反串的第一个循环节:

1. 坏点不在A,那么可以暴力匹配检验。

2. 坏点不在B,那么把串翻转后不在A中,转化为1

3. 坏点在AB的交里面,那么只要长度为NL+1的前后缀相同,那么就存在长度为L的循环节。

通过扩展KMP和Hash快速判断即可,时间复杂度O(dnlogn)

  

Trial Finals:

Wyznaczanie planu sieci drogowej 2

n2次每次取出一个度数=1的点和一个度数>1的点连边;最后一次取出两个度数=1的点连边。

  

Finals:

Computational Biology

对于每个长度为m的子串,由其向循环移一位的字符串hash连边,找最大环即可。

时间复杂度O(qnlogn)

  

Byteland Worldbeat Publishers

不妨设n=m,考虑一个完美匹配:

  • 对于每条匹配边(u,v,w),连边uv,边权w
  • 对于每条非匹配边(u,v,w),连边vu,边权w

那么每个完美匹配权值和相同当且仅当每个环的边权和都是0

注意到所有环都可以由uvu+1v+1u拼成,于是对于所有(u,v)检查这样的环边权和是否是0即可。

将信息排序后双指针即可完成检查。

时间复杂度O(klogk+n+m)

  

Exam

即求出与每个矩形有交的编号最大的矩形f[i],若f[i]i则矩形i处于顶层。

枚举矩形i和矩形j的形状,那么询问范围是二维滑窗,对着x扫描线,对着y维护线段树即可。

时间复杂度O(nlogn)

  

Computational Geometry

n为奇数则无解,否则n的方案可以由n2的方案右边拼上1×22×1的矩形得到。

  

Coprime Numbers

gi表示数字i倍数的出现次数,fi表示有多少对数字的最大公约数是i的倍数,则fi=C(gi,2)f2if3i

时间复杂度O(aloga)

  

Prime prime power

对于ab,如果b=2,那么在[n,n+klogk]内必定能找到k个质数作为a

筛出n14内的所有质数,暴力枚举所有落在该区间内的倍数,将其筛掉,即可判断每个数是否是质数。

然后以最大的质数的平方作为上界,枚举更大的ab,这里方案数指数级下降,故暴力即可。

最后排序输出第k小的值即可。

时间复杂度O(n13+klog2k)

  

Hard Choice

在每条边两个点中间加上一个虚拟点代表这条边权,就可以化边权为点权。

把没删掉的边用LCT维护一棵生成树,树边都是桥。

对于一条非树边,把树上对应路径上所有边的权值都修改为0,表示都不是桥。

然后倒着处理询问,对于每次删掉的边,把两点路径上边权都修改为0

询问等价于查询两点间边权和,若两点连通且路径上不存在桥,则有解。

  

posted @   Claris  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2017-10-16 BZOJ2319 : 黑白棋游戏
2017-10-16 XIII Open Grodno SU Championship
点击右上角即可分享
微信分享提示