校內模擬 層流 樹鏈剖分

2021-09-11 18:26:52 字數 2870 閱讀 6957

給出一棵樹,給出n條邊,問這些邊兩兩之間是否滿足兩個條件之一①覆蓋對方或被對方覆蓋 ②沒有相交。如果都滿足輸出yes,否則輸出no。

題解考場上第一眼就覺得是樹剖,畢竟前段時間天天見到這種型別的東西。

做法有點差分的意思,在每條邊的兩個頂點異或上某個值,然後查詢這條邊上的異或和,如果合法異或和當然為0。

但這樣一來有個問題,就是一條被覆蓋的邊,其頂點可能與覆蓋它的那條邊的頂點之一重合,統計的時候就會出問題。考場上想了很久,最後逼不得已在樹剖外層寫了個特判,結果 0 pts滾粗。

說起來方法其實很簡單,只需要把邊按長度從小到大排個序再依次加入就完成了~

(至於為什麼除錯半天只有98pts我也很納悶,但方法應該沒錯 )

#include

#define rint register int

#define iint inline int

#define ivoid inline void

#define endll '\n'

#define ll long long

using

namespace std;

const

int n=

1e6+5;

const

int m=

3e3+5;

const

int inf=

0x3f3f3f3f

;int m,n,q,k,x,y,z,u,v,w,s,t,l,r,ql,qr,flag;

int a[n]

,b[n]

,a1[n]

,b1[n]

,head[n]

,dis[n]

,vis[n]

;int fa[n]

,deep[n]

,size[n]

,son[n]

,id[n]

,top[n]

,ori[n]

,val[n<<2]

;int sum,cnt,ans,res,num,tot;

struct edgeedge[n<<2]

;//樹上的邊

struct accacc[n<<2]

;//要統計的邊

iint rad()

while

(c>=

'0'&&c<=

'9')x=

(x<<3)

+(x<<1)

+c-'0'

,c=getchar()

;return x*f;

}ivoid addedge

(int u,

int v)

,head[u]

=cnt;

}ivoid dfs1

(int x)

}ivoid dfs2

(int x,

int op)

}ivoid pushup

(int n)

ivoid build

(int n,

int l,

int r)

int mid=

(l+r)

>>1;

build

(n<<

1,l,mid)

;build

((n<<1)

|1,mid+

1,r)

;pushup

(n);

}ivoid query

(int n,

int l,

int r,

int ql,

int qr)

int mid=

(l+r)

>>1;

if(mid>=ql)

query

(n<<

1,l,mid,ql,qr);if

(midquery

((n<<1)

|1,mid+

1,r,ql,qr);}

ivoid change_one

(int n,

int l,

int r,

int pos,

int change)

int mid=

(l+r)

>>1;

if(mid>=pos)

change_one

(n<<

1,l,mid,pos,change)

;else

change_one

((n<<1)

|1,mid+

1,r,pos,change)

;pushup

(n);

}ivoid lca_query

(int x,

int y)

if(deep[x]

)swap

(x,y)

; ql=id[y]

,qr=id[x]

,query(1

,1,n,ql,qr);if

(ans!=

12321)}

iint lca

(int x,

int y)

if(deep[x]

)swap

(x,y)

;return y;

}iint cmp

(acc q1,acc q2)

intmain()

;}sort

(acc+

1,acc+m+

1,cmp)

;build(1

,1,n);

for(rint i=

1;i<=m;i++

) cout<<

"yes"

;exit(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...

2018 10 05 校內模擬 二分 狀壓 樹剖

t1 階乘 fact.cpp 問題描述 有 n個正整數 a i 設它們乘積為 p,你可以給 p乘上乙個正整數 q,使 p q剛好為正 整數m的階乘,求m的最小值。輸入 共兩行。第一行乙個正整數n。第二行n個正整數a i 輸出 共一行乙個正整數m。輸入樣例 16 輸出樣例 3樣例解釋 當p 6,q 1...

校內模擬 長鏈剖分 線段樹 看門人

題意 求一棵樹上每個點的子樹中經過這個點的所有路徑中邊數在給定範圍內的最長路徑 早上8 05開考,8 10分看完題就秒了 然而有個地方沒有開longlong 而且線段樹維護長鏈的方向反了 所以連部分分都沒了 裸的長鏈剖分,需要用線段樹維護區間最大值,最好是zkw線段樹 偷懶不想寫 code incl...