NBUT 1457 Sona(莫隊演算法 離散化)

2022-02-27 14:45:05 字數 1403 閱讀 1567

莫隊演算法就是能用n*sqrt(n)的時間來解決無修改區間查詢的一種辦法……,主要處理就是把詢問暫時不按照讀入順序而按照所在塊和右端點值為關鍵字進行排序,然後對這樣的乙個暫時非正常的詢問順序進行計算回答,然後可以再次按照輸入順序排序或者用陣列記錄答案後輸出。

可以參考這篇部落格:莫隊演算法經典例題

這題寫出立方公式就很容易發現a^3和(a+1)^3以及(a-1)^3的區別,然後就可以很方便地進行o(1)轉化,網上一些題解**都是暴力減掉當前的再加回更新的,即減掉a*a*a再加上(a+1)*(a+1)*(a+1),感覺這樣寫不太好……,反正如果能快速得到[l-1,r]或[l,r+1]這樣的區間資訊的話莫隊演算法值得一試。這題用了輸入輸出外掛程式搞到2100+ms,一些人直接用立方加減的3300+ms

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

#define clr(x,y) memset(x,y,sizeof(x))

#define lc(x) (x<<1)

#define rc(x) ((x<<1)+1)

#define mid(x,y) ((x+y)>>1)

typedef pairpii;

typedef __int64 ll;

const double pi=acos(-1.0);

const int n=100010;

struct info

;info node[n];

ll arr[n];

int unit,b[n];

ll cnt[n];

ll ans[n];

inline bool cmp(const info &a,const info &b)

void out(ll a)

int main(void)

sort(b+1,b+1+n);

int m=unique(b+1,b+1+n)-b-1;

for (i=1; i<=n; ++i)

arr[i]=lower_bound(b+1,b+1+m,arr[i])-b;

unit=(int)sqrt(1.0*n);

scanf("%d",&k);

for (i=0; inode[i].l)

update(--l,1,temp);

while (rnode[i].r)

update(r--,-1,temp);

ans[node[i].id]=temp;

} for (i=0; iinit();

} return 0;

}

NBUT 1457 Sona(莫隊演算法)

題意 給定 n 105 的序列,q 105 次詢問 每次 詢問求 l,r 中每個數 字出現次 數的立方 和 分析 離散 化之後莫 隊模版題 vj抓題顯示64 位為ll d,藍兒 其實是i 64d,還 有謎之c e,模版 題坑的一 口老血。created by taosama on 2016 01 2...

莫隊演算法 NBUT1457 Sona

如果乙個問題可以簡單地描述為 對於乙個長度為n陣列,給出m個查詢,每個查詢為區間 l,r 顯然,當l 1,r n時該演算法的時間複雜度為o n 2 但是通過莫隊演算法改變查詢的順序,我們能夠把時間複雜度降為o n n 此處證明略去。維護乙個當前的左右端點currentl和currentr,表示當前查...

NBUT 1457 Sona 莫隊演算法

題意 有n個數,有m個詢問,求每次詢問的區間 l,r 中,每種數字出現次數的立方和 分析 一開始不會莫隊演算法,結果想了很久,分析複雜度之後發現在轉移區間這一塊複雜度很大。後來發現莫隊演算法能很好解決這個問題。那麼就先說一下莫隊演算法吧,其實這個演算法還挺簡單的,能夠離線處理一類區間查詢不修改類問題...