Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/fontdata.js

ZOJ Monthly, January 2018

A. Candy Game

显然最优策略是一个一个吃,故比较哪种糖果的个数比较多即可。

  

B. PreSuffix

对所有串建立AC自动机,那么若前缀i是前缀j的后缀,说明i是Fail树上j的祖先。

所以对于询问(x,y),答案就是两点在Fail树上的LCA在原Trie中子树内的字符串总数。

时间复杂度O(n\log n)

  

C. An Unsure Catch

考虑k=0的情形:

对于每个连通块,断开一条环边变成树,求出树上每个点的深度d

设环长为len,则该连通块中最优解为d\bmod len中出现次数最多的那一个。

考虑k>0的情形,有两种最优策略:

1. 利用一步操作将某个环长修改为1,再用k-1步操作把其它k-1个连通块合并上来。

故此时答案为连通块点数最大的k个的点数之和。

2. 不刻意制造长度为1的环,直接用k步操作把k-1个连通块合并到某个点上。

枚举每个连通块作为最终合并点,假设其环长为K,则要选k-1个其它连通块,将它们各断开一条边,然后将环长修改为K,使得d\bmod K中出现次数最大值最大。

注意到K的取值只有O(\sqrt{n})种,枚举每个K,对于每个连通块计算最优解,然后计数排序统计前k大值的和即可。

对于每个连通块,假设环长为len,那么按顺序依次断开每条环边后,对断开点子树内所有d的影响是整体减去len,共O(n)次修改和O(n)次查询。

注意到每次修改时,只会将某个数加1或减1,故最大值也只会变化1,记录每种值有多少个即可判断最大值是否需要变化,时间复杂度O(1)

总时间复杂度O(n\sqrt{n})

  

D. Seat Assignment

lcm(1,2,...,10)=2520,对于模lcm的每个余数k分析其是否是110的倍数,可以发现一共48种本质不同的情况。

那么计算出每种情况的容量之后,就转化成了左边10个点,右边48个点的最大流。

  

E. Yet Another Data Structure Problem

线段树维护序列乘积mul,标记(a,b)表示mul=a\times mul^b

时间复杂度O(n\log n\log P)

UPD:

P=1000000007的原根g5,如果将每个数都取指标的话,则变为模P-1意义下的区间加、区间乘、区间求和,可以线段树O(n\log n)维护。

对于每个询问,求出区间指标之和sum后,该询问的答案ans=g^{sum}\bmod P

注意到只需要预处理11000的指标,故更改BSGS算法中的步长为300000,可以降低每次求指标的时间复杂度。

    

F. The Limit

如果分子分母不同时为0,那么极限显然,否则根据洛必达法则分别求导计算。

  

G. It's High Noon

假设人位于(x,y),若攻击部分背对原点,那么显然最优情况下(x,y)=(0,0)。将所有点极角排序然后双指针枚举即可。注意特判点在原点的情况。

若攻击部分面向原点,那么显然最优情况下x^2+y^2=R^2,且直线与圆相切。抠除圆内部的所有点之后,对于剩下的点求出切线角度,那么角度在某个区间内的直线都能取到这个点,扫描线统计即可。

时间复杂度O(n\log n)

  

H. Traveling Plan

对于每个点x求出d_x表示离它最近的补给站到它的距离。

对于每条边(x,y,w),将边权重置为d_x+d_y+w

那么对于询问(x,y),答案就是最小生成树上两点间边权的最大值。

时间复杂度O(n\log n)

  

I. Wooden Bridge

留坑。

 

J. Distance

枚举O(n^2)对区间右端点,左端点的取值满足单调性,双指针即可。

时间复杂度O(n^2)

  

posted @   Claris  阅读(1834)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示