QBXT Day2
遭遇
【问题描述】
你是能看到第一题的 friends呢。
—— hja
N座楼房,立于城中 。
第i座楼,高度 hi。
你需要一开始选择座楼,开始跳楼。 在第 i座楼准备跳需要 ci的花费。 每次可以跳到任何一个还没有过的楼上去。但是代价,另外一座楼的代价是两高度差绝对值 ,最后一次从楼上跳到地面不需 要代价(只能跳到地上一次)。为在代价不超过 T的情况下,最多跳几次楼。 (一座楼 只能 跳一次 ,且每次 跳楼 都要 计算 准备 的花费 )
【输入格式】
第一行个整数 N,代表 楼的数量。
接下来一行 N个整数代表 ci。
接下来一行 N个整数代表 hi。
最后一行一个整数 T。
【输出格式】
一行个整数 代表答案 。
【样例输入】
4
3 5 4 11
2 1
3 17
【样例输出】
3
【样例解释】
从1号楼跳到 2号楼再跳到 3号楼是一种 可行 的方案 。
【数据范围与规定】
对于 30%的数据, 1≤n≤5。
对于另外 20%的数据,所有 ℎi相同。
对于另外 20%的数据, ci=0。
对于 100%的数据, 1≤N≤50,1≤ci,ℎi≤106,1≤T≤10^7。
30分:暴力搜索
hi相同的20%:按c为关键字,对数据进行排序。选择花费最小的楼开始跳(贪心)
ci=0的20%:按高度h由大到小进行排序,然后按高度由高到低进行跳跃。
100%:
a.
考虑一个跳楼的集合{1,2,4,5}。
\begin{equation*}cost1=c_1+c_2+c_4+c_5.\end{equation*}
按h对数据排序。
推一下式子:$cost2=h_max - h_min$.
枚举起点和终点(最高的楼和最低的楼),那么只需要确定cost1的代价。
由于假定i是最低的一栋楼,j是最高的一栋楼。所以只需要找到使得len([i,j])最大,且$cost\leq T$的值。
复杂度$O(n^3\log n)$
b.
标程做法:动态规划。
设状态f[i][j]表示现在停留在第i栋楼上,已经跳了j次楼的最小花费是多少。
转移:直接枚举下一次跳的是哪一栋楼。($i<k\leq n$)。转移方程$f[k][j+1]=\min\{f[k][j+1], f[i][j]+f[i][j]+c[k]+h[k]-h[i]\}$
答案:枚举所有的f[i][j],$ans=\max\{f[i][j]\leq T\}$
都市
【问题描述】
你是能看到第二题的 friends呢。
—— laekov
塔立于都市, 攀登上塔,能够到达更远的地方。但是需要破解谜 题。仍然有 N个数,但并不给你 而是了$N\times\frac{N-1}{2}$个数,代表它们两两的和。那么,这 N个数是多少呢?
【输入格式】
一行个整数 N。
接下来一行 $N\times\frac{N-1}{2}$个数,代表两之和。
【输出格式】
第一行个整数 s代表解的个数 。
接下来 s行 ,每行N个数 代表一组解,数从小到大排列。解的顺序按照字典从大到小排列。
【样例输入1】
4
3 5 4 7 6 5
【样例输出1】
1
1 2 3 4
【样例输入2】
4
11 17 21 12 20 15
【样例输出2】
2
4 7 8 13
3 8 9 12
【数据范围与规定】
对于 30%的数据, 1≤N≤5,N个数均不超过 10。
对于 60%的数据, 1≤N≤50,N个数均不超过 100。
对于 100%的数据, 1≤N≤300,N个数均不超过 10^8。
考虑最终的答案为$a_1,a_2,\cdots,a_n$;题目给出的数为$b_1,b_2,\cdots,b_{\frac{n\times(n-1)}{2}}$。
给两个数组排序。易证以上两个数列存在以下性质:
1. $a_1+a_2=b_1$,
2. $a_1+a_3=b_2$.
但是不能保证$a_2+a_3$的值。
设$a_2+a_3=x$,可以算出$a_1,a_2,a_3$,把这三个数从b数组中删掉,可以证明a[1]+a[4]为最小值。计算出a[4]的值,然后可以确定a[1]+a[5]为最小值。然后就可以做了。
现在问题变为求x的值。枚举a[2]+a[3]在是b数组中是哪一个。从头到尾解一遍方程验证是否合法。
或者二分?set/map/手写平衡树?
街灯
【问题描述】
你是能看到第三题的 friends呢。
—— aoao
街上的灯亮起,指引向着远方的路。每个街灯上都有一数, 每次询问,第l个街灯到第 r个街灯上的数模 p等于 v的有几个。
【输入格式】
第一行两个数 N,M,代表街灯的个数 和询问。
接下来一行 N个数,代表 街灯上的数。
接下来M行,每四个数 l,r,p,v代表一组询问。
【输出格式】
对于每次询问,输出一行代表答案 。
【样例输入】
5 2
1 5 2 3 7
1
3 2 2 5 3 0
【样例输出】
2
1
【数据规模与约定】
对于 30%的数据, 1≤N,M≤10^3。
对于另外 30%的 数据,每次询问的p一样。
对于 100%的数据, 1≤N,M≤10^5,街灯上的数不超过 10^4,1≤p≤10^9。
30%:暴力
p相等的30%:
把所有的数先mod p,然后开p个vector ,记录mod p == v的数。然后用线段树。
e.g.
1 5 2 3 4 p==3
1 2 2 0 1
vector<int> v[p];
v=0: 4
v=1: 1,5
v=2: 2,3
二分区间。
100%:
同上60%的做法。可以只考虑$p\leq 10^4$的情况,预处理出p的所有情况(TLE)。
可以只对$p \leq 100$的部分进行预处理。对于所有$p\leq 100$的值,同60%的做法,在对应的数组中二分一下即可。
对于p>100的情况,就不预处理了。容易看出$v+kp\leq 10^4 \rightarrow p\leq 100$.
最多枚举100个数,同60分的做法,在数组中二分即可。$O(n\sqrt n\log n)$
主席树?
洗澡
【问题描述】
你是能看到第一题的 friends 呢。
——hja
洗澡的地方,有一段括号序列,将一个括号修改一次需要1的代价(将左括
号变成右括号或者相反) ,求最小代价使得括号序列合法。
【输入格式】
一行一个括号序列。
【输出格式】
一行一个整数代表答案。
【样例输入】
())(
【样例输出】
2
【数据范围与规定】
50%的数据,括号序列长度不超过100。
对于100%的数据,括号序列长度不超过10 5 且一定为偶数,只包含小括号。
SB原题。栈模拟。然而我zz。
日记
【问题描述】
你是能看到第二题的 friends 呢。
——laekov
日记之中,写满了质数,两个质数之间如果没有其他质数,那么则称为相
邻的质数。给定?,?,询问不超过?的数中能够表示成连续?个质数之和的最大
的数是多少。
【输入格式】
第一行一个整数?代表数据组数。
对于每组数据,一行行两个整数?,?。
【输出格式】
对于每组数据,一行一个整数代表答案。如果不存在,则输出−1。
【样例输入】
3
20 2
20 3
20 4
【样例输出】
18
15
17
【数据范围与规定】
21 ≤ ? ≤ 100。
40%的数据,? = 1。
另外20%的数据,所有的询问的?相等。
对于100%的数据,1 ≤ ? < 2000,1 ≤ ? ≤ 10 6 。