NBUT 1457 Sona(莫隊演算法)

2021-07-09 15:36:30 字數 1787 閱讀 3708

題意:

給定

n≤105

的序列,

q≤105

次詢問 每次

詢問求[

l,r]

中每個數

字出現次

數的立方

分析:

離散

化之後莫

隊模版題

vj抓題顯示64

位為ll

d,藍兒

其實是i

64d,還

有謎之c

e,模版

題坑的一

口老血。

。。

**:

//

// created by taosama on 2016-01-25

//#pragma comment(linker, "/stack:1024000000,1024000000")

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define pr(x) cout << #x << " = " << x << " "

#define prln(x) cout << #x << " = " << x << endl

const

int n = 1e5 + 10, inf = 0x3f3f3f3f, mod = 1e9 + 7;

const

int b = 400;

typedef

long

long ll;

int n, q, a[n];

int cnt[n];

struct query

};ll sum, ans[n];

ll cube(ll x)

void update(int i, int delta)

int main()

sort(xs.begin(), xs.end());

xs.resize(unique(xs.begin(), xs.end()) - xs.begin());

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

a[i] = lower_bound(xs.begin(), xs.end(), a[i]) - xs.begin() + 1;

scanf("%d", &q);

vector

> q(n / b + 2, vector

());

for(int i = 1; i <= q; ++i) );

}for(int i = 0; i < q.size(); ++i) sort(q[i].begin(), q[i].end());

sum = 0;

for(int i = 0; i < q.size(); ++i)

for(int j = l; j < r; ++j) update(j, -1);

}for(int i = 1; i <= q; ++i) printf("%i64d\n", ans[i]);

}return

0;}

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

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

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