Turing Tree(數狀陣列)

2021-08-08 23:00:32 字數 1343 閱讀 1632

**:

sample output

156

36

statistic | 

submit | 

back

題意:求乙個區間內不重複數字的和,例如1 1 1 3,區間[1,4]的和為4。

題解:先把要求的區間按右區間公升序排序,再把原來的陣列按順序依次插入樹狀陣列,假設當前插入a[i],

先判斷a[i]在之前有沒有出現過,沒有的話直接插入add(i,a[i]),記錄這個位置;有的話就當前位置

插入a[i],上一次的位置減去a[i],add(i,a[i]);  add(mp[a[i]],-a[i]);。。然後查詢是否有把當前位置作為右

區間的查詢q,有的話就查詢該段區間的和。

**:

#include#include#include#include#include#include#include#define maxn 30010

#define m 100010

#define ll long long

using namespace std;

int n,t,q;

int a[maxn],rl[maxn],rr[maxn];

mapmp;

struct node q[m];

ll tree[maxn],ans[m];

int lowbit(int x)

bool cmp(node a,node b)

return s;

} int main()

sort(q+1,q+1+q,cmp);

memset(tree,0,sizeof tree);

memset(rl,0,sizeof rl);

memset(rr,0,sizeof rr);

int f=1;

rl[q[f].r]=f;

rr[q[f].r]=f;

for(k=2; k<=q;)

mp.clear();

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

if(!rl[i])continue;

int l=rl[i],r=rr[i];

ll ss=getsum(i);

for(j=l; j<=r; j++)

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

}return 0;

}

sample output

156

36

statistic | 

submit | 

back

數狀陣列(入門)

學習陣列陣列的好處 樹狀陣列相對於線段樹的編碼來講,樹狀陣列的編碼並不複雜,反而很簡單,對於一些區間求和,區間求最大值,維護區間的問題,反而能更簡單的解決 樹狀陣列核心 int lowbit int i lowbit 可以尋找樹狀陣列中的前向位置和後向位置 例如要更改乙個區間當中的和 void up...

模板數狀陣列

如題,已知乙個數列,你需要進行下面兩種操作 第一行包含兩個正整數 n,m,分別表示該數列數字的個數和操作的總個數。第二行包含 n個用空格分隔的整數,其中第 i個數字表示數列第 i項的初始值。接下來 m行每行包含 3個整數,表示乙個操作,具體如下 輸出包含若干行整數,即為所有操作 222 的結果。in...

poj 3298 數狀陣列

題目大意是一條大街上住著n個桌球愛好者,他們的水平高低用乙個數值表示,他們經常舉辦比賽,比賽要三個人,一人當裁判。對裁判是有一定要求的,裁判的水平必須介於兩選手之間且必須住他們中間,計算可以舉辦多少場比賽 include include define maxn 100005 int c 20050 ...