樹狀陣列總結篇

2022-05-21 00:51:09 字數 3309 閱讀 3015

傳送門

題意:在日本的東海岸和西海岸修交通線,問這些交通線有多少交叉點;

解法:按照x座標公升序,相同的情況下y公升序排序,然後查詢在之前有多少滿足條件的即可

#include #include #include #include #define n 1005

#define ll long long

using namespacestd;

typedef structnode

}node;

node a[n*n];

ll d[n];

int get_id(intx)

void update(intx)

}ll sum(intx)

returnans;

}intmain()

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

update(a[1].y);

ll sum=0;

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

printf("test case %d: ",++case);

printf("%lld\n",sum);

}return 0;

}

傳送門題意:給你一顆蘋果樹,每個節點初始都有乙個蘋果,執行一些操作(有蘋果的直接拿掉 沒有的直接補上去乙個蘋果),然後查詢這個節點的子樹上有多少個蘋果;

解法:第一反應樹剖+樹狀陣列查詢區間和(似乎有更簡單的樹狀陣列 並不會2333333)

#include #include #include #include #include #include #define n 100005

using namespacestd;

int pos;int son[n];int deep[n];inta[n];

int first[n*2];int next[n*2];int vi[n*2];

voidintx()

int fa[n];intnum[n];

void dfs1(int v,intpre)}}

}int p[n];int tp[n];intfp[n];

void dfs2(int v,inttd)

}intd[n];

int get_id(intx)

intn;

void get_d(intn)

}}void update(int x,intt)

}int sum(intx)

returnans;

}intmain()

dfs1(1,0);

dfs2(1,1);

memset(a,0,sizeof(a));

for(int i=1;i<=n;i++) a[i]=1;

memset(d,0,sizeof(d));

get_d(n);

int q;scanf("%d",&q);char s[5];

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

else if(s[0]=='c')

else}}

// for(int i=1;i<=n;i++) vec[i].clear();

} return 0;

}

傳送門題意:求乙個區間是多少個區間真子區間(只允許乙個端點相同)

解法:按照x公升序排序後,x相同時按照y的降序排序;然後查詢即可(可能存在完全相等的兩個區間;要注意這個下標從0開始)

#include #include #include #include #include #include #define n 100005

using namespacestd;

typedef structnode

}node;

node a[n];

int d[n];intvis[n];

int get_id(intx)

void update(intx)

}void sum(int x,intbiao)

vis[biao]=ans;

}intmain()

int u=0;

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

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

else

}u++;

update(a[i].y);

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

printf("\n");

}return 0;

}

傳送門題意:給你每個星星的位置,求這個星星的座標範圍內有多少個星星(包括自己)

題解:按照x公升序x相同時公升序,查詢統計即可;

#include #include #include #include #define n 32005

#define m 15005

using namespacestd;

typedef structnode

}node;

intn;

node a[m];

int d[n];intvis[n];

int get_id(intx)

void update(intx)

}void sum(intx)

vis[ans]++;

}intmain()

memset(vis,0,sizeof(vis));

memset(d,0,sizeof(d));

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

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

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

}return 0;

}

最後一題:

傳送門題意:給乙個正方形,初始都是0,1操作是乙個點的修改,2查詢左下角和右上角形成的矩陣的和

題解:一維樹狀陣列拓展為二維樹狀陣列 在x y方向彼此獨立

#include #include 

#include

#include

#define ll long long

using

namespace

std;

ll d[

1030][1030

];int get_id(int

x)void update(int x,int y,int

vulue)

}}int sum(int x,int

y) }

return

ans;

}int

main()

else

if(t==2

) }

}return0;

}

樹狀陣列(總結篇)

by zyq 2014 7 樹狀陣列何其牛逼只能這麼形容啊。首先,網上好多對樹狀陣列基礎知識講解的在這就不細講了。可以參考 內容比較老了 下面總結一下樹狀陣列的題型 1.最簡單的單點更新區間查詢 其實這個是樹狀陣列的精髓了,不過入門的時候都會做些簡單題找感覺吧。下面附上簡單題找感覺,動腦子的題後面貼...

樹狀陣列總結

樹狀陣列的基本知識已經被各種大牛和菜鳥講到爛了,我就不多說了,下面給出基本操作的 假定原陣列為a 1.n 樹狀陣列b 1.n 考慮靈活性的需要,使用int a傳陣列。define lowbit x x x int sum int a,int x void update int a,int x,int...

樹狀陣列總結

樹狀陣列是對乙個陣列改變某個元素和求和比較實用的資料結構。兩中操作都是o logn 在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下...