問題: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
所以要通過排序來操作
#include#include#include #include using namespace std;
#define ll long long
ll b[105000];
int n;
int lowbit(int x)
void upd(int x,ll val)
}ll query(int x)
return res;
}struct point
p[400500];
bool cmp(point left,point right)
ll s[100500];
int ans[200500];
int main ()
for(int i=1;i<=q;++i)
printf("%d\n",ans[i]);
}return 0;
}
zoj 樹狀陣列經典 未解
問題 n個點,對於每個點i,都有一條連向i 1的有向邊,另外有m條其他的有向邊,有q個詢問 u,v 求u到v的最短路 將m條有向邊和q個詢問對所表示的點對一起排序,u,v u大的排前,u一樣的v小的排前,u和v一樣大的先處理插入的再處理詢問的 邊插入邊詢問 樹狀陣列裡存的是右端點在v之後的詢問的結果...
zoj 2112 主席樹套樹狀陣列
現在把主席樹的原理給弄清楚了,從i 1開始,每次新插入乙個數,就為他建一棵線段樹 當然第一次i 0的時候是建一棵空樹 線段樹裡面儲存的是1 i的樹的位置情況 簡單來說,如果有m個樹,則每棵線段樹都是範圍為1 m的,至於1 i沒有m個那就先讓它空著不管,我只負責1 i裡面的數的位置情況插入到線段樹裡面...
HDU1541 經典樹狀陣列
hdu1541 題意 如圖,等級為0的點有1,等級為1得點有4,2 等級為2的點有3,等級為3的點有5 即即左下角的點的個數 現給你一些點 x,y 輸入順序按y公升序,y相等時按x公升序排列 請分別輸出等級0 n 1的點的個數 分析 暴力超時tel,用g 提交也超時 include include ...