树状数组
一种高效的数据结构
为什么他们cf写的这么快
这个作者很懒,什么都没留下…
展开
-
Hello 2018 D. Too Easy Problems(树状数组+优先队列+贪心)
题目链接 思路:按a值进行排序,如果发现当前时间和大于T了,就优先删除t值较大的。 #include<bits/stdc++.h> using namespace std; const int maxn =2e5+1; #define lowbit(i) (i)&(-i) typedef long long ll; struct cxk{ int a,t,id; f...原创 2020-04-21 21:36:34 · 228 阅读 · 0 评论 -
51Nod - 1249 近似有序区间 (单调栈+树状数组+偏序)(好题)
题目链接 极大极小子段,就是一个序列,它的最小值在最前面,它的最大值在最后面。现在给你一个由1~n的一个排列构成的数组S,求它有多少个这样的子段 例如:S = {3, 1, 2, 5, 4},S的所有极大极小子段为: {3}, {1}, {1, 2}, {1, 2, 5}, {2}, {2, 5}, {5}, {4} Input 第一行:一个数N,表示S的长度。(1 <= N <= 5...原创 2020-04-21 20:57:59 · 214 阅读 · 0 评论 -
hdu5592 ZYB's Premutation(树状数组+二分+思维)
题目链接 Problem Description ZYB has a premutation P,but he only remeber the reverse log of each prefix of the premutation,now he ask you to restore the premutation. Pair (i,j)(i<j) is considered as a ...原创 2020-04-19 10:09:54 · 133 阅读 · 0 评论 -
Codeforces Round #227 (Div. 2) E. George and Cards(树状数组+贪心+思维)
题目链接 题意:给一个长度为n的数列,每个数在1-n之间且各不相同。你可以从这个数列中删数:每次选一段区间,可以删除这个区间中最小的那个数,然后每次删除得到的分数是这个区间的长度。题目要你把原序列删成一个规定的长度为k的序列,并要得分最高。 思路:贪心的按数从小到大删,用set来维护b数组,同时二分查找大于当前数的位置,具体看代码 #include<bits/stdc++.h> us...原创 2020-04-15 19:31:51 · 125 阅读 · 0 评论 -
Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) B. Cards Sorting(树状数组+模拟)
题目链接 思路:考虑一下每个数被取时候和前一个被取得数之间的贡献,比如12 2 2 10 12 1,很明显10这个是肯定是12取完之后再取10,我们只有知道2和10之间有多少数比10大就行了,如果2的位置在10的右边也很好算,就是总数减去2到10中间的那块就行了,比如2和1,只要总数-【2的位置,1的位置】比2大的数就可以了,可是这里这么算有一个前提,就是你的知道这n个数被取时候的顺序才行,,比...原创 2020-04-07 22:17:55 · 106 阅读 · 0 评论 -
Codeforces Round #198 (Div. 1) D. Iahub and Xors(多棵树状数组求区间异或+差分)
题目链接 思路:给一段区间【l,r】都异或上v,最后又求异或和的话我们会发现中间的很多v其实都可以约掉的,所以我们可以利用差分的思想用树状数组在l和r+1的位置处插入v。唯一难理解的就是在l这个位置插入v的话,其实它能影响的位置只有l+2,l+4。。。也就是和位置l奇偶性相同的位置。(PS:这个地方理解的其实并不是很透彻,日后回来再看看)。 #include <bits/stdc++.h&...原创 2020-04-07 21:43:53 · 109 阅读 · 0 评论 -
Educational Codeforces Round 10 D. Nested Segments(树状数组+二维偏序)
题目链接 题意:给你n个线段,要求你第i个线段能够将多少个线段完全包覆。 思路:由于保证了没有点会重合就很简单了,算是二维偏序里最基础的了,差不多就是求li<=lj&&rj<=ri,我们可以先按右端点排序,这样就固定了一维,剩下的就是查找以下有多少个左端点是大于我当前的左端点就行了。 #include <bits/stdc++.h> using names...原创 2020-04-06 21:35:02 · 133 阅读 · 0 评论 -
Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution(多颗树状数组+思维)
题目链接 题意:给出一个DNA序列(n<=1e5),有两种操作: 1 x c 表示将x位置的碱基换成c 2 l r e 表示一个询问:e字符串(|e|<=10)在[l,r]区间内循环出现,问有多少个位置的字符相同? 思路:由于要查询的字符串长度很小,我们可以预处理以下,c【x】【y】【z】【i】代表的是对于长度为y的e字符串,第i个字母在e中的对应位置是x,第i个字符串为...原创 2020-04-06 21:31:26 · 137 阅读 · 0 评论 -
Codeforces Round #182 (Div. 1) D. Yaroslav and Divisors(树状数组+思维)
题目链接 题意:给定初始数组,m个询问,每次询问问你【l,r】内一个数是另一个数的因子,求数量。 思路:我们一开始是想按右端点排序,然后计算以下query(s【i】.r)-query(s【i】.l-1)就行了,但是这样有一个问题,我们忘了减去【1,l-1】里的每个的每个数对【l,r】里的数产生的贡献了,但是这个贡献不好直接减,于是有一个神乎奇迹的解法,就是再这一个数组,s1维护的是左端点,s2...原创 2020-04-05 21:54:04 · 131 阅读 · 0 评论 -
Educational Codeforces Round 41 (Rated for Div. 2) E. Tufurama(树状数组+偏序)
题目链接 题意:给定一个数组,要求你满足a【i】>=j&&a【j】>=i(i<j)的i,j对的数量。 思路:用我们用树状数组来维护a【j】>=i的数量,只要在【i+1,a【i】】这个区间查询就可以了。 #include<bits/stdc++.h> using namespace std; typedef long long ll; #defi...原创 2020-04-05 21:47:21 · 162 阅读 · 0 评论 -
hdu4417 Super Mario(树状数组+离线区间操作)
题目链接 Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory. Now the poor princess is in trouble again and Mario needs to save his lov...原创 2020-04-05 21:18:34 · 144 阅读 · 0 评论 -
2019ICPC 沈阳重现 A-Leftbest(树状数组+二分)
7-1 A-Leftbest Jack is worried about being single for his whole life, so he begins to use a famous dating app. In this app, the user is shown single men/women’s photos one by one, and the user may cho...原创 2020-03-28 21:42:18 · 227 阅读 · 0 评论 -
C1099 [Contest #8] 菜菜种菜 (树状数组+二维偏序)(好题)
题目链接 思路:首先转换以下问题,我们可以设置两个数组L【i】和R【i】,L【i】表示比i的左边所能到达的最近的数,R【i】表示比i的右边所能到达的最近的数,于是问题就转化为了,对于一个查询【l,r】如果i存在贡献的话,i一定满足l<=i<=r并且L【i】<l&&R【i】>r,这个就是典型的偏序问题了。我们还是先固定一遍,我们把查询按右端点固定,然后存一...原创 2020-03-24 21:22:13 · 178 阅读 · 0 评论 -
Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum(树状数组+区间异或)
题目链接 题意:给定一个区间,要求这个区间出现偶数次的数的异或和。 思路:一开始并不知道怎么求偶数次的数的异或和,看了大佬的题解发现有这么个方法,sum【i】表示1-i的前缀异或和,它就等于所以出现奇数的数的异或和,比如一个数组1 1 1 2 2 3,它的异或和其实就等于1x3(不信?不信你自己算算),为了编辑方面这里所有的“x“都表示异或的意思,那么我们要求1到n的偶数次的数的异或和怎么求呢...原创 2020-03-24 16:51:10 · 94 阅读 · 0 评论 -
PAT顶级 1027 Larry and Inversions (35分)(树状数组)
题目链接 Sample Input: 3 2 1 3 Sample Output: 1 0 2 1 2 1 Hint: The original array is { 2, 1, 3 }. Reversing subarray [0…0] makes { 2, 1, 3 } which has 1 inversion. Reversing subarray [0…1] makes { 1, 2,...原创 2020-03-10 11:04:39 · 71 阅读 · 0 评论 -
Codeforces Round #624 (Div. 3) F. Moving Points(树状数组+思维)
题目链接 思路:一开始一直想不通为什么这道题过的人那么多,后来才发现自己是傻逼,题目明明说了t不一定是整数,还在算两点相遇的时间。。。(好气啊,不然就可以AK div3了)。 如果xi<xj并且vi<vj的话那么i和j永远不能相遇,贡献为0,所以对于i来说要求的就是位置在i之前,速度还比i大的点,树状数组维护一下点的个数和前缀和就行了。。。 #include <bits/st...原创 2020-02-26 20:40:08 · 113 阅读 · 0 评论 -
Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) D. Restore Permutation(树状数组+二分)
题目链接 思路:这题明着想确实不好想,不过倒着想其实挺简单的,用树状数组维护前缀和,要想知道第i位填的是哪些数字,只要二分一下大于a【i】的前缀和,r就是答案,然后依次动态更新。 #include<bits/stdc++.h> #define lowbit(i) (i)&(-i) #define ll long long using namespace std; cons...原创 2020-02-26 20:45:26 · 101 阅读 · 0 评论 -
Codeforces Round #595 (Div. 3) D2. Too Many Segments (hard version)(树状数组+贪心+思维)
题目链接 题意:要你删除最少的线段,使得每个点的线段覆盖数小于k。 思路:我们优先删除右端点大的线段,用树状数组维护每个点的线段覆盖数量。 #include<bits/stdc++.h> using namespace std; const int maxn=2e5+1; #define lowbit(i) ((i)&(-i)) int n,k,c[maxn],maxx;...原创 2020-02-18 19:53:06 · 134 阅读 · 0 评论 -
Technocup 2020 - Elimination Round 3 D2. Optimal Subsequences (Hard Version) (树状数组+二分+思维)
题目链接 题意:给一个长度为n的序列,m次询问,问你原序列的总和最大且字典序最小的长度为k的子序列的第pos位元素是多少。 思路:一开始每个长度得最优序列其实是可以构造出来的,但是数组开不了那么大,而且也容易tle,所以一种思路不行换一种思路,我们可以将这m个询问进行排序,由于是离线操作,我们可以通过树状数组来快速构造满足条件的序列,这里简单说一下怎么的序列是最优的,就是尽可能地保留大的数,...原创 2020-02-21 21:26:02 · 191 阅读 · 0 评论 -
Codeforces Round #609 (Div. 1) C. K Integers(树状数组+二分+思维)
题意:给定一个初始序列,f(k)为把原序列的一个字串变成1,2,,,k所执行的最小操作,每次操作只能再相邻两个位置进行交换。 思路:很容易发现当1~k都是相邻的时候答案为逆序对,如果1-k不相邻的话怎么才能时操作最小呢,只需要把他们全都变成相邻的即可,具体看代码。 #include <bits/stdc++.h> typedef long long ll; const int max...原创 2020-01-08 22:50:15 · 171 阅读 · 0 评论 -
Codeforces Educational Codeforces Round 80 (Rated for Div. 2) E - Messenger Simulator(树状数组+思维)
题意:给定m个移动,存到a数组里表示,mi表示要把mi这个数移动到数组最前面,问m次移动中,1到n每个数在移动过程的最小和最大下标。 思路:其实这个思路挺好想的,但是比赛的时候用树状数组调处了bug,最后就呜呜呜~~~~ 首先,如果有数被移动到最前面,那么它最小下标一定为1,如果没有,那么最小下标就是它一开始的下标(它没有被移动最前面,那么它的结果就是要么不动,要么被推到后面)。 然后就是最大...原创 2020-01-16 19:41:51 · 173 阅读 · 0 评论 -
牛客挑战赛36 C 纸飞机(树状数组)
链接:https://ac.nowcoder.com/acm/contest/3782/C 来源:牛客网 直线上有n座山峰,第i座的高度为hi。从某座山峰上放飞一架纸飞机,它可以从左往右依次经过一系列高度严格递减的山头。 假设五座山峰的高度依次是3,4,3,2,1。从第一座山峰上放飞的纸飞机可以依次经过第一、四、五座山峰,但不能经过第二、三座山峰。 对于每座山峰,求出要经过除这座山峰外的每座山峰,...原创 2020-01-18 16:52:24 · 191 阅读 · 0 评论