接下来就是暴力分块了,首先我们要清楚的是,删去了这个数之后,他会的逆序对贡献会减少前面比他大的数的个数,再减少后面比他小的数的个数,比如5 4 3 2 1 我们删去了3,那么前面比他大的数的个数,也就是2(5和4比他大),后面比他小的数的个数为2(2和1) 所以我们就直接对每个块排序,对于包含位置x的块...
分块 分块,就是将原序列处理成各个小块,目的是尽量地达到处理和询问之间的平衡 常用于:原本O(1)修改O(n)查询或O(n)修改O(1)查询优化成O(sqrt(n))修改O(sqrt(n))查询,或者看起来很像线段树(树状数组)但是又不好维护的。 有些专门卡空间的题可以用分块做(lca)。 能用分块就尽量不用树套树。 分块...
1.经典问题:给一个长度为n序列,保证两两不同,求逆序对数,值域≤1018,n≤5∗106. 归并排序就不说了(我也没写过),一般是用树状数组做这个的吧~ 但是值域这么大开不下呀怎么办呀~当然是选择离散化了 比如我们可以这样: #definerep(i,n) for(register int i=1;i<=n;i++)intn,w[N],rak[N]; inl...
给你n个数,m个询问 每次单点修改,然后问你现在整个序列的lis长度。 修改完之后,要求修改回去。 解法: 询问离线。 我们维护四个东西,dp1[i]表示从1开始到第i个位置的最长上升子序列长度,dp2[i]表示从n开始到第i个位置的最长递减子序列长度。dp3[i]表示第i个询问的那个位置从1开始到第x(即询问的位置)个位...
求的是 如果a[i]小于等于0的话其实可以全局加上某一个数字,变成正的,要不然szsz干不了他 像我这样智商不够归并排序的蒟蒻只能靠数据结构来凑啦
这个用树状数组维护,但是权值太大需要离散化。 这里的离散化是用新数组排序再二分查找,比用结构体排两次方便一些。 然后需要多加一个0表示s[0]。 代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
先到9,我们把其排好序的位置拿出,即为5。 然后统计位置5之前有多少1。 1 1 1 1 1 ——— > 4个 ans+=4 然后把5号位置放为0。 1 1 1 1 0 继续操作即可。。。 这个树状数组维护即可。。。 注意开long long和原序列排序后要去重。。。 View Code...
Sample Input 5 3 3 2 1 4 7 Q 1 4 3 C 2 6 Q 2 5 3 Sample Output 3 6 HINT 20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。 Source 题解: 树状数组套主席树。程序中有注释。耐心看就看懂了。 View Code...
12 3456789 10111213141516 17181920212223 242527282930 1234567
一开始就感觉有点像线段树,输入数据太大我们可以离线处理把数据离散化下,然后扔到线段树上,维护两个数组: sum: 区间数的值的和 num: 区间数的数量和 ,对于每次询问的first和second,我们找到第first个和第second个分别是哪两个数字, 如果两个数字不相同,那么就先算出分别取了多少个这两个数字,对于两个数字中间...