2018.12.15【NOIP提高组】模拟A组

T1:简单dp,但是要大力卡常。

其中一种保证正确性的方法就是在枚举e[i]*c[i]的和的时候后一般秩序枚举到总和的一半即可,因为若在后一半的和还超过总和的一半的话,那么最终一定是不可能回到0的。

 

T2:首先通过打表找规律发现,“好数”只可能是以下4种情况:0、6、2^k(k>=0)、质数。

这题有一个十分巧妙的地方,就是对于一个数mod操作最多只有log次是有效的。

那么我们便可以用线段树来维护每一个区间的最大值,在执行mod操作时只有一个区间的最大值大于模数时才递归这个区间。这样n个数,每个数最多被操作log次,复杂度是nlogn的。

对于其他两个操作便是单点修改和区间查询。

总结:这一类题十分巧妙,它们一般没有一个特别高深的思路,但是就是抓住了形如“每一个数最多修改不超过log次”之类的条件。而且这一类题一般以序列中的查询与修改为背景。而一般的操作就是mod、&等只会变小的操作。

 

T3:按列分治。

假设当前区间的中间列为mid,那么设f[i][j]表示(i,j)这个点是否能到mid这一列的n个点(f为bitset操作,(i,j)在mid左边)。

那么我们可以尝试倒推f,即f[i][j]=f[i+1][j]|f[i][j+1],注意判断a[i+1][j]和a[i][j+1]是否为0。

接着,我们可以设一个g[i][j],定义与f[i][j]相同,只是(i,j)在mid右边,则g的倒推方程与f有些不同,即:g[i][j]=g[i-1][j]|g[i][j-1]。

然后我们可以对于起点在当前区间的左半边,终点在当前区间的右半边的询问求解,即判断f[x1][y1]&g[x2][y2]是否全为0。这个具体操作就是预处理出每一个询问的起点和终点是在哪一个区间分开的。这样就可以在n^3log/64的复杂度中做出这一题来了。

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