
树状数组
yp_2013
这个作者很懒,什么都没留下…
展开
-
hdu 5592 ZYB's Premutation
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5592题意: 有一个排列,给出1到i区间的逆序对数,让你还原这个排列!思维题,用线段树做,很显然根据相邻两个数的差,就能得出后一个数的加入又新产生了几个逆序对,那么显然就应该倒着做,可以得出后面的这个数是第k大的,取出当前第k大的数,放到这个位置上就ok了!!线段树维护的是前缀和,具体做法是这样的:原创 2016-01-18 22:14:26 · 439 阅读 · 2 评论 -
hdu5792
狗b题,气死我了,思路正确,离散化的时候相同元素要按照位置从小到大排,然后不用两遍求,手推一下,做减法就可以了~#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <map> #include <vector> using namespace std; #define ll lo原创 2016-08-02 18:59:46 · 621 阅读 · 0 评论 -
hdu 5372 离散化加树状数组
注意离散化的时候是对左右端点一起离散化的,所以maxn要开成2倍的~#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn=2e5+10; struct node{ int op,l,r; }a[maxn]; int c1[maxn<<1],c2[maxn<<1]; int lowbit原创 2016-05-31 08:57:43 · 363 阅读 · 0 评论 -
hdu 5700 区间交
#include<cstdio> #include<cstring> #include<algorithm> #include<set> #include<map> #include<vector> #define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++) #define per(i,j,k) for(int i=(int)j;i>=(int)k;i--)原创 2016-05-24 22:47:49 · 360 阅读 · 0 评论 -
POJ 2763 Housewife Wind
题意: 知道了一颗有 n 个节点的树和树上每条边的权值,对应两种操作: 【LCA_RMQ+树状数组】 0 x 输出 当前节点到 x节点的最短距离,并移动到 x 节点位置 1 x val 把第 x 条边的权值改为 val 分析: 树上两个节点a,b的距离可以转化为 dis[a] + dis[b] - 2*dis[lca(a,b)] 其中 d原创 2016-02-23 11:09:59 · 305 阅读 · 0 评论 -
POJ2299 树状数组求逆序数
给定n个数,要求这些数构成的逆序对的个数。除了用归并排序来求逆序对个数,还可以使用树状数组来求解。 树状数组求解的思路:开一个能大小为这些数的最大值的树状数组,并全部置0。从头到尾读入这些数,每读入一个数就更新树状数组,查看它前面比它小的已出现过的有多少个数sum,然后用当前位置减去该sum,就可以得到当前数导致的逆序对数了。把所有的加起来就是总的逆序对数。 题目中的数都是独一无二的,这些数最大转载 2016-02-22 20:16:08 · 304 阅读 · 0 评论 -
hdu 5618 Jam's problem again
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5618题意: 三维坐标,对于1个点,找出有多少个点,3个坐标都比该点小! 很神奇的解法,cdq分治,分治的方法是每次都是计算左边对右边贡献的答案为多少。先对第一维x排序,然后把前一半打上标记0,说明他们是x较小的,然后再对y排序,并以此为基准去进行计数,在计数的过程中,对z用树状数组进行维护,即把该原创 2016-02-04 14:13:37 · 936 阅读 · 0 评论 -
hdu 5542 The Battle of Chibi
题意: 求n个数中长度为m的上升子序列的个数 dpij表示到达i位置,长度为j的方案数目!dp[i][j] = sum( dp[k][j-1], iff a[k] < a[i], 0<=k<i)。树状数组优化dp,对每一个长度都用树状数组记录对应位置的方案数! 这道题主要是让我T的刻骨铭心,好几处位置,一个是%mod,要判断大于了再余!! 一个是m,有可能n很大,m很小,如果每次都把所有的长原创 2016-03-02 21:24:31 · 992 阅读 · 0 评论 -
hdu 5296 Annoying problem
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5296题目大意:给出一棵树,每个边都有一个权值,现在有一个空的集合,两种操作,1 x吧x节点放到集合中(如果还没放入),2 x把x节点从集合中拿出来(已放入)。现在要求将集合中的点之间的边权之和dfn[u] - dfn[ lca(x,u) ] - dfn[ lca(y,u) ] + dfn[ lca(x原创 2016-02-12 16:52:27 · 547 阅读 · 0 评论 -
hdu5862树状数组加扫描线
树状数组加扫描线的思想 #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include原创 2016-08-18 23:05:26 · 433 阅读 · 0 评论