![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构---树状数组
小松萘
厉害的人可真多啊
展开
-
HDU - 4630 No Pain No Game(离线,树状数组)
????♂️ ????♂️ ????♂️题意:一个长为n的数组,m次查询,询问(l,r)中两个数字之间GCD(l,r中任意一对,只要GCD最大即可)(1)处理出每个数字的约数,GCD一定是在这个区间中出现两次即以上的最大的那个约数(2)对于查询按照l排序之后,我们再从后往前更新最大约数,如果这个约数在该位置之后出现过,我们就在他出现的后一个位置更新他(查询时查询r)(3)杭电数据好像有误,如11...原创 2020-02-26 10:47:13 · 169 阅读 · 0 评论 -
HDU - 1394 Minimum Inversion Number (逆序数)
???? ???? ????(为了方便处理把a[ i ]全都加一处理)注意到每次更改都是从第一个位置挪到最后一个位置,可知每次挪动,减少a[ i ] - 1个逆序对,增加n-a[ i ]个逆序对,所以我们利用树状数组维护出未挪动的时候的答案,对每次挪动直接计算即可。int n,c[MAXN],a[MAXN];void update(int x, int v){while (x <= n) {c[x] ...原创 2020-02-25 20:42:52 · 145 阅读 · 0 评论 -
HDU - 2227 Find the nondecreasing subsequences(离散化,树状数组,递推)
???? ???? ????容易得到这样一个式子,假设dp[ i ]表示以i结尾的子序列个数,则:这样我们以ai为下标,维护一个前缀和即可,最后的答案就是所有dp的和(即更新到最后mx的前缀和),但是ai是1e9的,所以还需要离散化一下。最后就是注意多组输入,,,WA了好多次原来错在这里#define int llconst int mod = 1e9 + 7;int mx,w[MAXN], hs[M...原创 2020-02-25 18:47:49 · 108 阅读 · 0 评论 -
HDU - 3874 Necklace(离线,前缀和,树状数组)
???? ???? ????(1)考虑维护出一个无重复元素的前缀,例如现在枚举到以 i 结尾的前缀,那么所有以 i 结尾的区间均可以直接查询出。(2)维护前缀的过程中,我们记录下每个数字最后出现的位置,并将之前出现过的贡献清零(因为该元素越靠右的位置越有可能对之后的答案有贡献)int n,w[MAXN];ll c[MAXN],ans[MAXN];void update(int x,int v){ whil...原创 2020-02-25 17:51:39 · 101 阅读 · 0 评论 -
2020牛客寒假算法基础集训营4 H - 坐火车 (前缀与后缀,方案数)
???? ???? ????#define int llint n;int c[MAXN];void update(int x,int v){ while (x <= n) {c[x]+=v; x += (x & (-x)); }}int que(int x){int sum = 0; while (x) { sum += c[x]; x -= (x & (-x)); }retur...原创 2020-02-12 14:38:25 · 155 阅读 · 0 评论 -
Educational Codeforces Round 80 (Rated for Div. 2) E - Messenger Simulator(前缀和,树状数组)
???? ???? ????题意:一个1到n的全排列,m次操作,表示将ai移动到数组的第一个位置,求过程中每个数的最小位置和最大位置。1,最小值为 1 / 初始位置2,最大值出现在某次移动这个数之前 or 全部移动完成之后3,因为数字不重复所以维护一个前缀和即可(记得空出来移动的位置)int n, m;int c[MAXN*2];void update(int x,int v){ while (x &...原创 2020-01-18 21:32:41 · 235 阅读 · 0 评论