2016 ACM/ICPC Asia Regional Dalian Online
1002.Different GCD Subarray Query
题意
- 给一个长为(N(N le 10^5))的序列(a_i(a_i le 10^6))。
- 有(Q(Q le 10^5))次询问,每次求区间([L,R])中所有子序列的gcd种类。
思路
- 固定某个子序列的某个端点,那么不同的gcd值最多有(log{a_i})种。
- 离线处理所有询问,按右端点(R)从小到大排序,记录gcd最右位置,用线段树或树状数组维护区间和。
1007.Friends and Enemies
题意
- 有(M)个人,(N)种颜色的石头,其中(M,N lt 2^{31})。
- 每个人有一串由若干种石头构成的项链,可以没项链,即石头集合为空。
- (M)个人要么是朋友关系,要么敌人关系。
- 朋友关系:两人的项链至少有一种颜色相同;
- 敌人关系:两个人没有相同颜色的石头。
- 判断对于所有可能的关系,(N)种颜色是否都能满足这些上述条件。
思路
- 需要的颜色种数尽可能多,即图上边尽可能多,又不能出现三元环。
- 手写小数据,发现二分图连边貌似是最多的(不会证明XD)。
1008.Function
题意
- 给长为(N(N le 10^5))序列(A_i)。
- (Q(Q le 10^5))次询问,每次求(F(l, r), 其中)(F(l, r))表示(A_l\%A_{l+1}\%...\%A_r)的值。
思路
- 若(a ge b),则(a \% b le frac a 2)。
- 每次二分往右找第一个小于等于当前余数的位置取模。
1009.Sparse Graph
题意
- 在补图中求单源最短路
思路
- 对于当前点来说,补图中有连边的点是一些区间,那么每次转移都是一段区间的转移,用一个set维护未扩展的点。
代码
1010.Weak Pair
题意
- 给一棵(N(N le 10^5))个点的有根树,每个点有权值(a_i)。
- 求((u, v))的对数,满足(u)是(v)的祖先且(a_u imes a_v le k)。
思路
- 对于每棵子树(u),与(u)配对的对数相当于在dfs序区间中权值小于等于(frac k{a_u})的个数。
- 那么按权值从小到大将点插入线段树(维护已出现的点个数),同时询问也按查询值从小到大排序,就边插入边查询。
- (a_i=0)需要特判。
代码