題意給出乙個n個點的樹,詢問編號在乙個區間內的點到給定點的最近距離。
題解分塊暴力求解,整塊中用spfa預處理,零散的用lca求解。
首先根據記憶體限制,計算出開啟能開200∗n
200*n
200∗
n的陣列,所以,每500
50050
0個點為一塊,在塊內跑一邊spfa,求出塊內的點到其他點的最短路。
詢問區間[l,
r][l,r]
[l,r
],分為多個整塊的和多個零散的在塊以外的,整塊的就用之前spfa處理的求解,零散的就分別於目標點做lca,求最小值即可。
需要注意的是,因為要大量求解lca,必須使用rmq的方法,才能o(1
)o(1)
o(1)
求解。**
#include
#define n 100510
#define inf 0x3f3f3f3f
#define eps 1e-10
// #define pi 3.141592653589793
// #define p 1000000007
#define ll long long
#define pb push_back
#define fi first
#define se second
#define cl clear
#define si size
#define lb lower_bound
#define ub upper_bound
#define mem(x) memset(x,0,sizeof x)
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define sccc(x,y,z) scanf("%d%d%d",&x,&y,&z)
using
namespace std;
#include
#include
#include
#include
using
namespace __gnu_pbds;
typedef pair<
int,
int> pi;
typedef pair<
int,pi> pp;
typedef __gnu_pbds::priority_queue
> heap;
int n,m;
int l[n]
,st[n<<1]
,dp[22]
[n<<1]
,d[n]
,cnt;
vectora[n]
;void
lable
(int x,
int ffa,
int p)
}int lg[n<<1]
;void
preprocess()
}inline
intquery
(int p,
int q)
inline
intask
(int x,
int y)
int sz=
500,id[
205]
[n],q[n<<2]
;void
spfa
(int x,
int* d)
bt[x]=0
;}}int
main()
lable(1
,-1,
0);preprocess()
;for
(int i=
0;i<=n;i+
=sz)
spfa
(i,id[i/
500]);
while
(m--
)printf
("%d\n"
,ans);}
}
lca的rmq方法模板void
lable
(int x,
int ffa,
int p)
}void
preprocess()
}int
query
(int p,
int q)
華中科技大學 找位置
題目描述 對給定的乙個字串,找出有重複的字元,並給出其位置,如 abcaaab12ab12 輸出 a,1 a,4 a,5 a,10,b,2 b,11,1,8 1,12,2,9 2,13。輸入描述 輸入包括乙個由字母和數字組成的字串,其長度不超過100。輸出描述 可能有多組測試資料,對於每組資料,按照...
華中科技大學複試 對稱矩陣
題目描述 輸入乙個n維矩陣,判斷是否對稱。輸入描述 輸入第一行包括乙個數 n 1 n 100 表示矩陣的維數。接下來的n行,每行包括n個數,表示n n矩陣的元素。輸出描述 可能有多組測試資料,對於每組資料,輸出 yes 表示矩陣為對稱矩陣。輸出 no 表示矩陣不是對稱矩陣。示例輸入4 16 19 1...
華中科技大學複試 找位置
題目描述 對給定的乙個字串,找出有重複的字元,並給出其位置,如 abcaaab12ab12 輸出 a,1 a,4 a,5 a,10,b,2 b,11,1,8 1,12,2,9 2,13。輸入描述 輸入包括乙個由字母和數字組成的字串,其長度不超過100。輸出描述 可能有多組測試資料,對於每組資料,按照...