TLE莫队代码: #include<bits/stdc++.h> usingnamespacestd; //莫队算法 //求区间种类 constintmaxn=1e6+1000; structnode { intl,r,k; }q[maxn]; intpos[maxn],a[maxn],kind[maxn]; boolcmp(nodex,nodey) { if(pos[x.l]==pos[y.l]) { returnx.r<y.r; } returnpos[x.l]<pos[y....
思路:贪心可知,时间小的在前。但是排序是不可能的,需要更高效的方法,注意到ai<=2e5,适合用树状数组记录a[i]的个数前缀和,以及a[i]的前缀和。 可以离线,所以用莫队+树状数组,莫队的话,第一次写这中数学类型的转移,开始还有点抵触,但是拿出笔一划,公式也不难。 对于暴力的公式,即L<=i<=R的所有i的前缀...
我们只需要查询,这些区间的区间颜色数就可以了,这里需要注意的是,当我们枚举的mex比较大的时候,此时分成的几个区间的mex可能比他们的真实值要小但是由于我们要求的是最大值,所以对答案没有影响,所以我们不需要知道区间mex只需要知道区间颜色数就可以,查询区间颜色数使用树状数组扫描线...
HDU 4638 Group 【树状数组,分块乱搞(莫队算法?)】 根据题目意思,很容易得出,一个区间里面连续的段数即为最少的group数。 题解上面给的是用树状数组维护的。 询问一个区间的时候,可以一个一个的向里面添加,只需要判断a[i]-1 和 a[i]+1是否已经添加在内,如果两个都在,则总段数减1,如果两个都不在,总...
HihoCoder 1488 : 排队接水(莫队+树状数组) 描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟。 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小。 小Hi总共会有m次询问,你能帮助他解决这个问题吗?
这道题也可以用树状数组或块状数组来做,但用莫队的话思维难度会比较低。 之前说过,我们要把一个区间的答案转移到与之相邻的区间中去,怎么做呢?我们用一个数组Cnt[]来记录每个数出现的次数,cur 表示当前区间的答案,例如: 现在转移到紧邻的区间就很简单了,例如转移到[l,r+1]: Cnt[2]=0,说明添加了一个没...
HDU 4638 Group 【树状数组,分块乱搞(莫队算 根据题目意思,很容易得出,一个区间里面连续的段数即为最少的group数。 题解上面给的是用树状数组维护的。 询问一个区间的时候,可以一个一个的向里面添加,只需要判断a[i]-1 和 a[i]+1是否已经添加在内,如果两个都在,则总段数减1,如果两个都不在,总段数...
树状数组 1、一般树状数组 1.int lowbit(int x){ 2. return x & (-x);3.} 4.long long sum(long long a[],int end){ 5. long long res=0;6. while(end){ 7. res=res+a[end];8. end=end-lowbit(end);9. } 10. return res;11.} 12.void modify(long long ...
题目询问区间内不同的数有多少个,即去重后数字的个数,本题的标准解法是线段树或树状数组。下面首先给出暴力法,然后再引导出莫队算法。 1. 暴力法 可以用STL的unique函数去重,一次耗时O(n),m次的总复杂度O(mn)。或者自己编码, 用扫描法统计数字出现的次数,这是一种简单易行的暴力法。
莫队算法是一个对于区间、树或其他结构离线(在线)维护的算法,此算法基于一些基本算法,例如暴力维护,树状数组,分块,最小曼哈顿距离生成树,对其进行揉合从而产生的一个简单易懂且短小好写的算法。此算法在很多情况下可以很轻松的切掉一些复杂而且难写的数据结构问题。