給你一棵樹,每次詢問樹上兩條鏈是否有交點。
第一行n,表示n個結點
第二行開始n-1行倆個·數x y,表示x,y有一條邊
接下來q,表示q個詢問
接下來q行四個數a b c d,詢問a到b的鏈是否與c到d的鏈有交點
輸出q行(yes或no)
sample input
輸入1:
1 21 3
2 42 5
5 65 7
3 82 5 4 3
5 3 8 8
5 4 6 7
4 8 6 7
輸入2:
2 13 1
4 25 3
6 27 2
8 59 3
10 6
11 5
12 7
13 11
14 1
15 1
1 2 3 4
4 7 1 9
2 3 7 9
2 6 7 8
2 1 6 8
sample output
輸出1:
yesno
yesno
輸出2:
yesno
yesyes
yes30%的資料1≤n,q≤3000
另外20%資料是一條鏈
100%的資料1≤n,q≤100000
題意:給你一棵樹,每次詢問樹上兩條鏈是否有交點。
30% 將第一條鏈上所有點打上標記,再遍歷第二條鏈,檢視第二條鏈上是 否有打上標記的點。
另外 20% 樹退化為一條鏈,每次詢問等價於查詢數軸上兩條線段是否相交。 100% 仔細觀察不難發現,兩條樹鏈相交的充要條件是其中一條路徑的頂點 在另一條路徑上,每次詢問求出 lca 判斷即可。
管他什麼正解,直接上樹鏈剖分
code:
1 #include2 #include3#define n 1000006
4#define lc (p<<1)
5#define rc (p<<1|1)
6using
namespace
std;
7struct
nodee[n];
10int
first[n],nxt[n],cnt;
11void add(int u,int
v)17
struct
tt[n];
20void pushup(int
p)23
void pushnow(int p,int
v)27
void pushdown(int
p)33}34
void build(int p,int l,int
r)41
int mid=l+r>>1;42
build(lc,l,mid);
43 build(rc,mid+1
,r);
44pushup(p);45}
46void update(int p,int ql,int qr,int
v)51
pushdown(p);
52int mid=t[p].l+t[p].r>>1;53
if(ql<=mid)update(lc,ql,qr,v);
54if(qr>mid)update(rc,ql,qr,v);
55pushup(p);56}
57int query(int p,int ql,int
qr)61
int ans=0;62
pushdown(p);
63int mid=t[p].l+t[p].r>>1;64
if(ql<=mid)ans+=query(lc,ql,qr);
65if(qr>mid)ans+=query(rc,ql,qr);
66pushup(p);
67return
ans;68}
69int
siz[n],hson[n],fa[n],dep[n];
70void dfs1(int
x)82}83
inttop[n],num[n],pre[n],tot;
84void dfs2(int x,int
tp)94}95
void modify(int x,int y,int
v)101
if(dep[x]102 update(1
,num[y],num[x],v);
103}
104int ask_sum(int x,int
y)111
if(dep[x]112 ans+=query(1
,num[y],num[x]);
113return
ans;
114}
115int
read()
122while
(isdigit(c))
126return x*f;
127}
128int
main()
137 dfs1(1
);138 dfs2(1,1
);139 build(1,1
,n);
140int
m;141 m=read();
142for(int i=1;i<=m;i++)
150}
151//
除錯語句注意
over
10 24T2 樹鏈剖分
2.盟主的憂慮 worry 問題描述 江湖由 n 個門派 2 n 100,000,編號從 1 到 n 組成,這些門派之間有 n 1 條小道將他們連線起來,每條道路都以 尺 為單位去計量,武林盟主發現任何兩個門派都能夠直接或者間接通過小道連線。雖然整個江湖是可以互相到達的,但是他擔心有心懷不軌之徒破壞...
NOIP模擬(11 03)T2 排列
排列 題目背景 11.03 noip 模擬t2 分析 線段樹 唯一一道可做題 我們從n 1 來確定每個數的位置,顯然,我們放入 n的時候,他一定在乙個逆序對數為 0的位置,因為它的前面不可能有比它大的,其次,如果 0位有多個,它一定在最後乙個 0位上,因為如果在前面的 0位上,後面的 0位上的數字一...
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...