本題做法:莫隊+分塊(輔助).
1用莫隊統計區間內每個數的個數以及所在塊中數的個數和種類數.
2.分塊按照值域分,整塊直接加上處理後的區間的相關資料,碎塊暴力列舉並統計在範圍內的數.
具體看**:
#include
#define n 100005
#define in read()
#define re register
using
namespace std;
int n,m,l,r,block;
int a[n]
,zhi,from[n]
,pos[n]
;int num[n]
;int ju[n]
;int ans1[n]
,ans2[n]
;struct zbq[n]
;inline
int in
while
(isdigit
(ch)
)return i;
}//讀優.
inline
bool
cmp(zb a,zb b)
//用三目比if快一點.
inline
void
add(
int x)
inline
void
jian
(int x)
inline
void
getans
(int a,
int b,
int id)
}return;}
intmain()
sort
(q+1
,q+m+
1,cmp)
; l=
1,r=0;
for(re int i=
1;i<=m;i++
)for
(re int i=
1;i<=m;i++
)printf
("%d %d\n"
,ans1[i]
,ans2[i]);
return0;
}
此題題面很毒,我們換乙個:
求區間[l,
r]
[l,r
]內眾數的個數.
演算法:莫隊+離散化(重點).
#include
#define n 500005
//小了會re
#define in read()
#define re register
using
namespace std;
const
int k=15;
//防止陣列下標為負數
int n,m,l,r,block;
int zhi,from[n]
,cnt[n]
,rk[n]
;int num[n]
;int ju[n]
;int ans[n]
;struct zbq[n]
;struct nodea[n]
;inline
int in
while
(isdigit
(ch)
)return i;
}inline
bool
cmp(zb a,zb b)
inline
bool
cmp2
(node a,node b)
inline
void
add(
int x)
inline
void
jian
(int x)
intmain()
//離散化
for(re int i=
1;i<=n;i++
) from[i]
=(i-1)
/block+1;
for(re int i=
1;i<=m;i++
)sort
(q+1
,q+m+
1,cmp)
; l=
1,r=
0,zhi=0;
for(re int i=
1;i<=m;i++
)for
(re int i=
1;i<=m;i++
)printf
("%d\n"
,ans[i]);
return0;
}
qwq 莫隊總結 莫隊例題
假設我們已知區間 l,r,需要計算的區間為 l,r,由於 l 和 r分別只能單步轉移,所以需要的時間複雜度為 l l r r 相當於把兩個區間分別看成是平面上的兩個整點p1 l,r 和p2 l,r 兩點之間的轉移開銷為兩點之間的曼哈頓距離。連線所有點的最優方案為一棵樹,那麼整體的時間複雜度就是這棵樹...
莫隊演算法 普通莫隊 智慧型暴力例題模板
1 基礎莫隊演算法2.莫隊演算法實現 莫隊演算法把排序做了簡單的修改,就把暴力法的複雜度從o mn 提高到o n n 1 暴力法的排序 把查詢的區間按左端點排序,如果左端點相同,再按右端點排序。莫隊演算法的排序 把陣列分塊 分成 n塊 然後把查詢的區間按左端點所在塊的序號排序,如果左端點的塊相同,再...
莫隊講解 普通莫隊
結束了分塊,我們來講下莫隊。據我所知,莫隊能解決一切區間問題,除了翻轉。因為它就是個暴力 其實這兩者的關係並不大。僅僅是時間複雜度一樣而已。我們把原序列分成 n塊 好像就是這裡相同 這裡說的序列是查詢序列l r,並不是讀入的a i 之後我們把序列排序 按照第一關鍵字為左端點所在的塊的大小,如果相同就...