T1
题意
一家餐厅有
n
n
n 道菜,编号
1
…
n
1 \ldots n
1…n,大家对第
i
i
i 道菜的评价值为
a
i
 
(
1
≤
i
≤
n
)
 
a_i \:( 1 \leq i \leq n ) \:
ai(1≤i≤n)。有
m
m
m 位顾客,第
i
i
i 位顾客的期望值为
b
i
b_i
bi,而他的偏好值为
x
i
x_i
xi。因此,第
i
i
i 位顾客认为第
j
j
j 道菜的美味度为
b
i
xor
(
a
j
+
x
i
)
b_i \mathbin{\text{xor}} (a_j + x_i)
bixor(aj+xi)(
xor
\text{xor}
xor 表示异或运算)。
第
i
i
i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第
l
i
l_i
li 道到第
r
i
r_i
ri 道中选择。请你帮助他们找出最美味的菜。
1
≤
n
≤
2
×
1
0
5
,
0
≤
a
i
,
b
i
,
x
i
<
1
0
5
,
1
≤
l
i
≤
r
i
≤
n
(
1
≤
i
≤
m
)
,
1
≤
m
≤
1
0
5
1 \leq n \leq 2 \times 10 ^ 5, 0 \leq a_i, b_i, x_i < 10 ^ 5, 1 \leq l_i \leq r_i \leq n(1 \leq i \leq m), 1 \leq m \leq 10 ^ 5
1≤n≤2×105,0≤ai,bi,xi<105,1≤li≤ri≤n(1≤i≤m),1≤m≤105
题解
考场:
如果不加
x
x
x,就是裸的可持久化
t
r
i
e
trie
trie树。考虑原来贪心查找时看的是一段值域内是否出现过值,加上
x
x
x,其实就是在
%
2
18
\% 2^{18}
%218意义下把整个值域区间向左移,即将原区间(
[
0
,
2
18
−
1
]
[0 , 2^{18}-1]
[0,218−1])复制后放到左边,值域都减掉x,按照原来的方式贪心查找,只需把可持久化
t
r
i
e
trie
trie树改成主席树来查找一段值域是否在区间内出现过。
T2
题意
俗话说,有钱就是任性。我们的高富帅鱼丸同学打算去看电影。鱼丸到了电影院以后,发现座位的编号正好是 1 1 1 到 200 200 200 。但是有一些座位号对应的座位坏掉了,没法坐,不妨假设还剩下 N N N 个能坐的椅子。电影的老板告诉鱼丸,如果你要包下一个集合 S S S 里的所有椅子,就要付出这些椅子的编号的最小公倍数的钱。鱼丸很任性地同意了。
来这里玩了很多天以后,鱼丸发现自己正好来了
2
N
−
1
2^N-1
2N−1 天,并且由于他非常任性,对于这
N
N
N 个椅子的每一种可能的非空子集,他都包下过来看电影。鱼丸大少爷虽然不在乎花了多少钱,但你毕竟是他的助理,于是你想知道鱼丸一共花了多少钱。由于钱的数量实在太大,请对答案
m
o
d
1
e
9
+
7
mod~1e9+7
mod 1e9+7之后输出。
N
≤
200
N \le 200
N≤200
题解
考场:
对于计数问题考虑DP,发现需要记下每个质因数选过的最大次数,直接爆炸。考虑有什么性质可以优化,由质因数分解联想到每个数大于根号的质因数最多有1个,所以考虑减掉记录大质因数的状态。即先只记2,3,5,7,11,13这6个质因数的状态(只有4320种),对于没有大于13质因数的直接做,对于有大于13的质因数的数,因为只有一个,就考虑分组,对于有同一个大质因数的所有数,也同理记录它小的质因数状态对应的方案数,最后就考虑每个大的质因数是否要选,暴力DP合并一下,理论效率是O(
n
∗
432
0
2
n*4320^{2}
n∗43202),但感觉非常不满,然而考场上没有正确剪枝,以及有一些地方会暴
i
n
t
int
int没有注意到,就挂到70了。实际上它真的很不满,把DP值为0的转态减掉即可。
注意写暴力对拍的时候,
l
c
m
lcm
lcm可能暴
l
o
n
g
l
o
n
g
long long
longlong,要用数组记录转态(因为这个拍挂了自闭了很久)
T3
题意
在无聊的时候,小K和小H会在纸上玩这样一个游戏。
我们可以将纸看做一个平面直角坐标系。小H会先在上面画出 n n n 个圆,并把每个圆的圆心以及半径都告诉小K。小H画的 n n n 个圆中,任意两个圆不会出现相交或相切的情况。小K需要做的就是从这 n n n 个圆中选出若干个圆,使得选出的任意一个圆都不被另一个选出的圆包含。游戏的目标就是要选出尽量多的圆。
游戏一次一次进行着,小K已经对游戏的规则感到了厌倦,所以他决定修改游戏的规则。对于第
i
i
i 个圆,我们定义它的价值为
w
i
w_i
wi 。新的游戏目标是使得选出的圆价值和最大(不一定数量最多)。但是圆圈可能很多,或者圆圈的分布非常奇怪,或者小K还有别的事情要做。所以他只好拜托你来帮他求出这个最大值了。
1
≤
x
i
,
y
i
,
r
i
≤
1
0
8
,
1
≤
w
i
≤
1000
1 \le x_i,y_i,r_i \le 10^8,1 \le w_i \le 1000
1≤xi,yi,ri≤108,1≤wi≤1000
题解
考场:
只剩下10分钟了什么都没想赶紧rush一个
2
n
2^{n}
2n暴力骗点分。。。
正解:
其实稍微思考一下就能发现选取限制关系是一个森林,把边建出来后树形DP即可。关键在于如何建边,即如何确定每一个圆的第一个包含它的圆作为父亲。直观地想法是按半径从小到大排序,每个找哪些圆它能包含且还未确定父亲的作为儿子,这样暴力
O
(
N
2
)
O(N^{2})
O(N2)就有60了,找儿子时用
K
D
t
r
e
e
KDtree
KDtree优化一下就能过了。
但我不会写
K
D
t
r
e
e
KDtree
KDtree(非NOIP知识点),且这里有一种效率更优的做法:
考虑先确定一个找父亲的顺序,因为两维除了KD外不好直接做,所以先按一维排个序这里按x从左往右扫,这样只需要考虑能覆盖到当前x这条线的圆,即每个圆在一个地方插入,一个地方删除。
考虑在一个圆加入时判断这个圆的父亲:通过画图可以发现,如果在这条线上,其他圆的覆盖范围包含圆心的纵坐标,那么这个圆的父亲就是最小的覆盖它的纵坐标的圆;否则它就是根。
考虑如何找出在这条线上第一个覆盖这个点的圆:如果能知道每个圆的覆盖范围,找到大于等于它的第一个圆,如果是下边界,父亲就是这个圆的父亲,否则父亲就是这个圆。因为要判上下边界,所以需要把一个圆拆为上下两部分,又发现对于半圆来说,在可覆盖的直线范围内,它们交点的大小关系是不会改变的,于是用
s
e
t
set
set维护能覆盖到当前直线半圆,定义一个以与当前直线的交点为关键字的比较规则,每次
l
o
w
e
r
b
o
u
n
d
lower_bound
lowerbound即可。