2019.07.03【NOIP提高组】模拟 A 组

T1:我们可以发现每一个点入树的优先选择的序列是一定的,那么我们可以先预处理出这一个序列来,然后每一次加入x个点的时候就选择这个序列前x个空的位置,并输出第x个空的位置对应的点的编号。这个用线段树实现。

在删除的时候,我们可以发现移动的只是x到根的一段路径上的点。那么我们用倍增求出x往上最顶的有人的点是哪一个,把这个点上的人删去就好了。

时间复杂度是O(n*log^2)的。

 

T2:很容易想到的暴力就是f[x]表示x这个数和已经出现过的数进行opt运算的最大值。查询的时候直接查询f[a[i]]即可。但加入一个a[i]的时候就要用x opt a[i]去更新所有的f[x],这个的时间复杂度是2^16*n的。

那么我们考虑均衡一下查询与加入的所耗的时间。设f[i][j]表示前8位为i的数与后8位为j的数进行opt运算的后8位的最大值。

设当前加入的a[i]前8位为x,后8位为y,那么我们就用j opt y去更新f[x][j]。

当我们要查询的时候,就在(x opt i)*2^8+f[i][y]中取最大值就好了。

方案数可以在dp过程中记录下来。

 

T3:暴力枚举区间竟然可以AC。

判断一个区间i~j可行的几个条件:

1、a[i]~a[j]在模d的意义下相同(注意负数情况)

2、a[i]~a[j]中无相同的数

3、设a[i]~a[j]的最大值为ma,最小值为mi。那么要满足(ma-mi)/d+1-(j-i+1)<=k,这一条是在保证项数足够。

正解待更新。

 

总结:比赛时暴力打错了,丢了40分。

最近暴力打错的情况较多,具体可以自己出几个小数据测一下。

需要计算的东西:数组大小、时间复杂度、变量类型、新增一个是否会栈溢出。

你可能感兴趣的:(【NOIP提高组】模拟A组)