NBUT 1457 莫隊演算法 離散化

2021-07-11 10:43:55 字數 1310 閱讀 1770

題意:求出每乙個區間的能量值,能量值等於所有數字出現次數的三次方之和.

很顯然離散化之後記錄下每乙個值出現的次數就能o(1)轉移了,刪除增加不難想.

特別坑的是要用__int64,好像n個分數也要用__int64.

#include #include #include #include #include using namespace std;

#define maxn 111111

int pos[maxn];

int n, m, k;

__int64 cnt[maxn];

__int64 ans[maxn], tmp[maxn];

struct node

} p[maxn];

struct reflect

}a[maxn];

__int64 cur;

__int64 f (__int64 x)

void add (int pos)

void del (int pos)

bool cmp (const reflect &a, const reflect &b)

int main ()

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

a[1].id = 1;

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

sort (a+1, a+1+n, cmp);

int block = ceil (sqrt (n*1.0));

for (int i = 1; i <= n; i++) pos[i] = (i-1)/block;

scanf ("%d", &m);

for (int i = 0; i < m; i++)

sort (p, p+m);

int l = 1, r = 1;

cur = 0;

memset (cnt, 0, sizeof cnt);

add (1);

for (int i = 0; i < m; i++)

while (r < p[i].r)

while (l > p[i].l)

while (l < p[i].l)

ans[p[i].id] = cur;

}for (int i = 0; i < m; i++)

}return 0;

}

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

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

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,表示當前查...