ACM ICPC Kharagpur Regional 2017
A - Science Fair
题目描述:给定一个有(n)个点,(m)条无向边的图,其中某两个点记为(S, T),另外标记(p)个点表示有一个学生。现在校车从(S)出发,接名单上的学生到(T),每个学生等概率地出现在名单上,当校车经过某个有学生的点时,不管名单上有没有那位学生,那位学生也会上车。每个学生有一个(talk)值,校车完成任务的花费为:到(T)时实际学生的(talk)值的乘积模(10^9+7)与路径长度的和。对于每一个名单,校车会选最小花费来走,求期望花费。
solution
求出(p)个点两两之间不经过其它(p)点的最短距离,以及与(S, T)的距离(不经过其它(p)点),然后状压求出到达(T)时有(sett)这些学生的最短距离。然后状压(dp)求出接(sett)这些学生时的最小花费。
时间复杂度:(O(2^p*p+p^p*m))
B - Black Discs
题目描述:给出(n)个直径在(x)轴上的半圆(半圆在(x)轴上方),每次询问给出一个在在第一象限的圆,问该圆与半圆的面积交。
C - Uniform Strings
题目描述:给出一个(01)串,求出相邻字符不同的个数,判断是否不超过两个。
solution
模拟。
时间复杂度:(O(串长度))
D - SAD Queries
题目描述:给定(K)个序列,每次询问指定两个序列(P, Q),求(sum_{i=1}^{p} sum_{j=1}^{q} |P_i-Q_j|)
solution
暴力,每次询问枚举较短的序列,二分较长序列。
时间复杂度:不会算
E - Chef and XOR Queries
题目描述:给定一棵树,边上有边权(未知)。有两种操作:1. 给定(x, y, v),判断按照已知信息(x)到(y)的简单路径的(XOR)是否可能是(v),如果是则(XOR)值视为(v),否则输出'WA', 2.询问(x, y)简单路径的(XOR)值,或者未知输出(-1)。
solution
树的形状是没有用的,用带权并查集记录每个点到并查集的根的(XOR)值,操作(1)相当于是并查集的合并。
时间复杂度:(O(Q+n))
F - Taxi Making Sharp Turns
题目描述:给出(n)条首尾相连(第一条与最后一条不连)的线段,从第一条线段的无连接一端出发走到最后,问走的过程中拐角是否有超过(45^{circ}),若有,则问是否能通过改变一点的坐标使得不存在拐角超过(45^{circ}).
solution
模拟。
G - Spam Classification Using Neural Net
题目描述:给出(n)条直线的斜截式方程,给定一个区间([minX, maxX]),将区间里的每个整数点进行操作:将(x)代入第一条直线,得到的结果作为(x)代入第二条直线,以此类推。问最后的结果是否都是偶数。
solution
结果的奇偶性至于初始值的奇偶性有关,把(0, 1)带进去算一下即可。
时间复杂度:(O(n))
H - Non Overlapping Segments
题目描述:有(n)条在(x)轴上的线段,每条线段的长度都是(R),左端坐标为整数(x_i),现在要将这些线段移到([0, L])(整条线段都要在里面),问最少移动多少条线段。
solution
将线段按(x_i)排序。记(f[i][j])表示前(i)条线段有(j)条没动能放多少条线段进来。枚举前一条线段(k),则(k, i)之间能放(frac{x_i-(x_k+R)}{R})条线段。如果(j+f[i][j] geq n),则用(n-j)更新答案。
时间复杂度:(O(n^3))
I - Spanning Tree
题目描述:有一个(n)个点的图,边权未知,每次可以选择(A, B)两个点集,询问(A, B)之间的边的最小值,系统会返回边的最小值以及该边的两个端点,或是不存在。求出该图的最小生成树的边权和。每次询问的花费为(|A|),总花费不能超过(10^4),(|A|+|B|)不能超过(2*10^6).
solution
用并查集维护连通性。每次找出最小的并查集(A),询问(A, A)的补集,得到的回答就是生成树上的一条边。
时间复杂度:(O(nlogn))
J - Generating A Permutation
题目描述:给定(n, K),找出一个(n)排列,满足(sum_{i=2}^{n} max(p_i, p_{i-1})=K),输出这个排列,或无解。
solution
以(n=5)为例:
54321
最小为(14)
35241
最大为(18)
显然,递减地排是最小的,从第(2)位开始隔一个放最大的数是最大的。以此来判断无解。
设最小值为(minv, k-=minv),用数组(cnt)记住每个数对答案的贡献,开始时除了(1)每个数对答案的贡献都是(1),(i)指向(n),(j)指向(2),若(k geq i-j),则(i)的贡献加(1),(j)的贡献减(1),而一个数的贡献最多为(2),所以(i--, j++);否则(j++)
算出每个数的贡献后就往排列填数即可。
时间复杂度:(O(n))
K - Number Game
题目描述:给定两个数(A, M)。开始时从(A)中移除一个数字((A)不变)得到(B),然后进行若干次操作:每次从(A)中移除一个数字((A)不变)得到(C),将(C)连到(B)的后面,得到新的(B)。问开始时有多少种移除方式,使得之后进行若干次操作后得到的数是(M)的倍数。
solution
把每种移除方式得到的数模(M)的值算出来,然后爆搜((bfs))得出每种模值是否能最终变成(0)
时间复杂度:(O(M^2))