本周刷水【2015.11.30~2015.12.6】

bzoj3489【可持久化线段树】
题目大意:
多组询问,每次查询一个区间中的只出现一次的数中的最大值,强制在线。
题解:
如果我们开一个last[i]表示a[i]上一次出现的位置,next[i]表示a[i]下一次出现的位置。那么对于区间[l,r]来说只有当一个数的last小于l 且 next大于r 才符合标准,那我们就可以对last可持久化,然后对于每个询问查询符合标准的数中最大的对应的那棵线段树中的区间最值即可。
Code:http://paste.ubuntu.com/13618586/

bzoj2818【线筛+欧拉函数】
题目大意:
求1~n中满足gcd为素数的有序数对数(即(x,y)和(y,x)算两个)。
题解:
因为gcd(x,y)=p(p是素数),所以gcd(x/p,y/p)=1,所以我们枚举每个小于n素数p,答案加上1到n/p之间的互质的数对数即可,即phi[n/p],然后将答案乘2,此时对于数对(p,p)被统计了两遍,所以再减去1~n之间的素数个数即可。
Code:http://paste.ubuntu.com/13618909/

bzoj3295【CDQ分治】
题目大意:
给出一个排列,进行m次删除,每次删数前输出序列的逆序对数。
题解:
首先正反扫两遍树状数组,可以知道原序列的逆序对数和每一个位置的数被计算进的逆序对数。然后对于一个逆序对(x,y),如果x和y都被删了的话,它俩构成的逆序对会被减两遍,整个序列的逆序数会减去它俩被计算进的逆序对数,然后应该再加1,这个”1”是来自在被删数列中的逆序对数,所以我们在CDQ的时候动态统计一下这个就好了。
Code:http://paste.ubuntu.com/13619315/

bzoj3671【贪心】
题目大意:
给出一系列规则构造出一个1~n×m的排列,按顺序填入一个n×m的矩阵,从左上角走到右下角,求路径经过的点排序后字典序最小的方案。
题解:
因为是排序后最小,所以能选小的就尽量选,那我们就可以从1~n×m枚举每个是不是能选,选了的话就把这个点的左下角和右上角的点标记为不能选,暴力即可过。因为发现选择的区间是连续的,所以可以开两个数组优化一下。注意不要爆内存。。
Code:http://paste.ubuntu.com/13668041/

bzoj3626【树链剖分】
题目大意:
给出一棵树,多次询问,每次给出一个区间[l,r]和一个点z,查询 l<=i<=rdep[LCA(i,z)] 。就是先从区间中选出一个点,然后求出它和z的LCA,然后再求这个区间内的每一个点到这个LCA的深度差的和。
题解:
看上去就像树链剖分,但是一直没想出做法,后来在大神的启发下发现可以容斥(好吧其实不大算是容斥)。『考虑这样的一种暴力,我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第一个有标记的点求出它的深度统计答案。观察到,深度其实就是上面有几个已标记了的点(包括自身)。』那做法就很显然了,首先我们对于一个询问区间差分一下,很容易看出操作具有可加性,区间[l,r]的答案就是区间[1,r]-[1,l-1],所以一个询问拆成两个询问,然后离线做,从1~n依次将该点到1的路径+1,线段树维护就好了。
Code:http://paste.ubuntu.com/13697963/

bzoj2002【分块】
题目大意:
给出一个数列 A Ai 表示从这个点出发将到达 i+Ai ,给出一些起始位置,每次询问这个位置需要跳多少次才能跳出序列。 Ai 可以修改。
题解:
一眼看上去像是一个图,后来一想好像可以分块。从n~1倒着预处理出来从每一个点跳到下一个块需要的次数,和它跳到下一个块的落点的位置,显然查询和修改都是 Osqrt(n)
Code:http://paste.ubuntu.com/13698382/

你可能感兴趣的:(本周刷水【2015.11.30~2015.12.6】)