zoj 樹狀陣列經典 未解

2021-06-16 21:25:12 字數 1369 閱讀 8326

問題:n個點,對於每個點i,都有一條連向i+1的有向邊,另外有m條其他的有向邊,有q個詢問(u,v)求u到v的最短路

將m條有向邊和q個詢問對所表示的點對一起排序,(u,v)u大的排前,u一樣的v小的排前,u和v一樣大的先處理插入的再處理詢問的;

邊插入邊詢問;

樹狀陣列裡存的是右端點在v之後的詢問的結果的差值

(1)對於(u,v)uv) 的那些還沒插入,樹狀陣列存mat[u1][v1]-(d[v1]-d[u1])的最小值,查詢時在加上(d[v]-d[u])

(2)對於(u,v)u>v的這種邊,保證在查詢到(u,v)之前,所有(u2,v2) v2

所以要通過排序來操作

[cpp]view plain

copy

#include

#include

#include 

#include 

using

namespace

std;  

#define ll long long

ll b[105000];  

intn;  

intlowbit(

intx)  

void

upd(

intx,ll val)  

}  ll query(int

x)  

return

res;  

}  struct

point  

p[400500];  

bool

cmp(point left,point right)  

ll s[100500];  

intans[200500];  

intmain ()  

scanf("%d"

,&q);  

for(

inti=1;i<=q;++i)  

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

n=n;  

memset(ans,0,sizeof

(ans)); 

// 一些詢問u=v,不初始化都為0,會錯

memset(b,0,sizeof

(b));  

for(

inti=1;i<=m+q;++i)  

for(int

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

b[i]=(1ll<<60);  

for(

inti=1;i<=m+q;++i)  

for(int

i=1;i<=q;++i)  

printf("%d\n"

,ans[i]);  

}  return

0;  

}  

zoj 3724 樹狀陣列經典

問題 n個點,對於每個點i,都有一條連向i 1的有向邊,另外有m條其他的有向邊,有q個詢問 u,v 求u到v的最短路 將m條有向邊和q個詢問對所表示的點對一起排序,u,v u大的排前,u一樣的v小的排前,u和v一樣大的先處理插入的再處理詢問的 邊插入邊詢問 樹狀陣列裡存的是右端點在v之後的詢問的結果...

樹狀陣列趣解

4操作原理 5小結 感謝各位能在白忙之中抽空來看鄙人的文章,cgg在這有禮了!先給張圖。下面的a是原陣列,而c則是a對應的樹狀陣列。所以你應該會恍然大悟 也許誇張了些 樹狀陣列是陣列的另一種表現形式,而這種表現形式會大大提高其各種操作的效率,在競賽中,也時常會考察,那麼下面,就讓我們一起去解開他神秘...

zoj 2112 主席樹套樹狀陣列

現在把主席樹的原理給弄清楚了,從i 1開始,每次新插入乙個數,就為他建一棵線段樹 當然第一次i 0的時候是建一棵空樹 線段樹裡面儲存的是1 i的樹的位置情況 簡單來說,如果有m個樹,則每棵線段樹都是範圍為1 m的,至於1 i沒有m個那就先讓它空著不管,我只負責1 i裡面的數的位置情況插入到線段樹裡面...