随笔分类 -  树状数组

摘要:题意: 给出a数组的排列。求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0。 题解: 用树状数组倒着求出以每个数为首的递增子序列个数。若总的个数之和小于k则输出-1。 总的个数可能非常大而k<=1e18。所以要判下上界。 最后从1~n扫 阅读全文
posted @ 2018-08-04 22:30 Pneuis 阅读(280) 评论(0) 推荐(0)
摘要:题意: 给出一棵树。两种操作,第一种是询问点u,v路径上的异或和,另一种是改一个点的值。 题解: 维护每个点到根节点的异或和。那么两个点之间的异或和就是两个点分别到根节点的异或和相异或,再异或上他们LCA节点的权值。 对于每次更改,只会影响他的子树到根节点的异或和。所以可以维护DFS序,每次修改一个 阅读全文
posted @ 2018-06-27 23:26 Pneuis 阅读(174) 评论(0) 推荐(0)
摘要:题意: 给定n支铅笔,问能不能分成若干堆,使得每堆数量不小于k且每堆的最大值和最小值之差不大于d。 题解: 排序。从后往前扫一遍。考虑以每个点为最小值建堆是否合法。对于当前点i,它需要至少k支铅笔,但是最大值不超过a[i]+d,所以就会有一个成立的范围[l,r]。假设存在点k(l<=k<=r),使得 阅读全文
posted @ 2018-05-22 08:51 Pneuis 阅读(521) 评论(0) 推荐(0)
摘要:题意: 给出一个长度为N的序列。M次操作,Q代表询问区间的第K大值,C代表修改一个位置的数。输出每次询问的第K大值。 题解: 修改第i个位置的数会影响i~n。所以可以用树状数组维护每次修改。树状数组的每个节点代表一棵树,统计结果时对应位置相加即可。 #include <bits/stdc++.h> 阅读全文
posted @ 2018-04-30 13:21 Pneuis 阅读(181) 评论(0) 推荐(0)
摘要:题意: 一个n*n的棋盘,有m个主教。每个主教都有自己的权值p。给出一个值C,在棋盘中找到一个最大点集。这个点集中的点在同一条对角线上且对于点集中任意两点(i,j),i和j之间的主教数(包括i,j)不小于pi^2+pj^2+C。 题解: 对角线有2个方向,每个方向有2*n-1条对角线。一共时4*n- 阅读全文
posted @ 2018-04-21 13:51 Pneuis 阅读(278) 评论(0) 推荐(0)
摘要:题意: 一个剧一共有n季,每季有ai集。问有多少对x,y(x≠y),使得第x季有第y集且第y季有第x集。 题解: 用set维护第i季的“寿命”,用树状数组维护第i季前有多少季还有第i集。 #include <bits/stdc++.h> using namespace std; const int 阅读全文
posted @ 2018-04-06 14:46 Pneuis 阅读(360) 评论(0) 推荐(0)