![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树状数组
Love_xyh
这个作者很懒,什么都没留下…
展开
-
[POI2007]TET-Tetris Attack
如果两个相同的数之间有x个未匹配的数,那么肯定要经过x次交换,所以与 [JLOI2013]删除物品类似,只要不做无效交换,交换数是一定的。 对于方案来讲,交换的位置是对于堆底的,所以当两个物品删除后,需要记录一个已被删去的物品的个数,输出位置时注意减去已被删去的物品的个数。 #include <bits/stdc++.h> #define lowbit(x) x&(-x) using namespace std; const int N=1e6+5; int n,dis,del,ans,原创 2020-08-06 15:33:13 · 131 阅读 · 0 评论 -
[JLOI2013]删除物品
将两堆放在一起,设分界点为mid。由于删除时只能按照编号降序依次删除,所以其实只要不重复做无用操作,操作次数是一定的。 首先将数字排序并记录数字的位置。从大到小删除。根据每个数字的位置与分界点的距离,计算删除每个数字的移动次数。每删除一个数以后,相应移动分界点的位置。 可以理解为:想要删除当前最大的,但位于一个堆的不是堆顶位置的数,需要先把与它同堆的上面的较小数都移动到另一堆中,而移动后,两堆的数量则会改变,mid表示的就是两堆的分界点位置。 当某数删除后,就进行单点修改。用数据结构维护区间sum值,查询区原创 2020-08-06 15:22:41 · 139 阅读 · 0 评论 -
[BOI2007]Mokia 摩基亚
CDQ分治做法: 保证左区间的所有t值 均 小于右区间的所有t值。(t:时间值) 在此条件下,根据x坐标更新树状数组,然后根据y坐标查询区间值 。 在查询区间值的时候,注意容斥 。 #include <bits/stdc++.h> #define y1 yy1 #define lowbit(x) x&(-x) using namespace std; const int N=2e6+5,Q=2e5+5; int opt,n,x,y,w,x1,y1,x2,y2,tot,cnt; int c原创 2020-08-06 13:55:25 · 127 阅读 · 0 评论 -
[POI2011]MET-Meteors
单调性是显然的,暴力也是显然的:即对于每个国家都进行一次二分答案。复杂度:nm logn 考虑对于一整段连续的国家整体二分。 在solve的过程中,对于1-mid次陨星雨增加的值,用线段树或树状数组来维护。进行区间累加以后,判断每一个国家是否能在前mid次陨星雨以后收集到相应的陨星。对于能与不能,分别放在左右区间,进行下一步递归。 这里注意两个小优化: 1.区间修改单点查询的线段树,可以利用差分思想后用树状数组维护。 2.对于每次solve,不用一遍又一遍地把1-mid次陨星雨都重新累加一遍。对于之前mid原创 2020-08-05 18:55:09 · 149 阅读 · 0 评论 -
[国家集训队]矩阵乘法
与静态kth的做法可以说是一模一样,计数改为用二维树状数组即可。 #include <bits/stdc++.h> #define lowbit(x) x&(-x) using namespace std; int n,m,x,a,b,c,d,k,minn,maxn,cnt; int sum[505][505],ans[60005]; struct node{int id1,id2,id3,id4,id,k,opt;}q[310005],q1[310005],q2[310005]; i原创 2020-08-05 18:19:35 · 109 阅读 · 0 评论 -
洛谷 P2617 Dynamic Rankings
整体二分做法: 对于序列中原数,与静态kth的做法一样;对于修改的点,我们可以把它拆为两个部分:修改前和修改后,修改前的权值赋为-1,修改后的权值赋为1,然后就与静态kth一模一样了。 注意一个误区:一开始我在想是不是要考虑修改操作与查询操作的时间顺序,其实我们就按照Q次询问的顺序,不断累加封装好的结构体即可。因为无论solve中怎么分治,修改操作与查询操作的相对顺序是永远不会改变的。 #include <bits/stdc++.h> #define lowbit(x) x&(-x) u原创 2020-08-05 17:30:58 · 110 阅读 · 0 评论 -
洛谷 P3834 【模板】可持久化线段树 2(主席树)
整体二分做法: 所谓整体二分,就是把一整块的询问放在一起进行二分答案,这是因为如果对于每个询问,单个单个二分求值的话肯定会超时。那么我们怎么把一整块的询问放在一起进行二分答案呢? 首先对于数组中原来的数和询问,把它们封装在一个结构体中,这个结构体包括x,y,k,id,opt等。(可能对于更复杂的题还需存储一些其余的值) 对于数组中原来的数,我们发现y,k是没有作用的,x代表的是这个位置的数的大小,id表示数的位置,opt是它的类型。 对于询问,x,y,k表示在区间x~y中查询第k小的数,id表示的是询问的编原创 2020-08-05 16:21:08 · 144 阅读 · 0 评论