2019.8.6测试题解(NOIP2019模拟)

T1

题意

一家餐厅有 n n n 道菜,编号 1 … n 1 \ldots n 1n,大家对第 i i i 道菜的评价值为 a i   ( 1 ≤ i ≤ n )   a_i \:( 1 \leq i \leq n ) \: ai(1in)。有 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 &lt; 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 &lt; 10 ^ 5, 1 \leq l_i \leq r_i \leq n(1 \leq i \leq m), 1 \leq m \leq 10 ^ 5 1n2×105,0ai,bi,xi<105,1lirin(1im),1m105

题解

考场:
如果不加 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,2181])复制后放到左边,值域都减掉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 2N1 天,并且由于他非常任性,对于这 N N N 个椅子的每一种可能的非空子集,他都包下过来看电影。鱼丸大少爷虽然不在乎花了多少钱,但你毕竟是他的助理,于是你想知道鱼丸一共花了多少钱。由于钱的数量实在太大,请对答案 m o d   1 e 9 + 7 mod~1e9+7 mod 1e9+7之后输出。
N ≤ 200 N \le 200 N200

题解

考场:
对于计数问题考虑DP,发现需要记下每个质因数选过的最大次数,直接爆炸。考虑有什么性质可以优化,由质因数分解联想到每个数大于根号的质因数最多有1个,所以考虑减掉记录大质因数的状态。即先只记2,3,5,7,11,13这6个质因数的状态(只有4320种),对于没有大于13质因数的直接做,对于有大于13的质因数的数,因为只有一个,就考虑分组,对于有同一个大质因数的所有数,也同理记录它小的质因数状态对应的方案数,最后就考虑每个大的质因数是否要选,暴力DP合并一下,理论效率是O( n ∗ 432 0 2 n*4320^{2} n43202),但感觉非常不满,然而考场上没有正确剪枝,以及有一些地方会暴 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 1xi,yi,ri1081wi1000

题解

考场:
只剩下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即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值