問題: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裡面的數的位置情況插入到線段樹裡面...