啦啦啦 來寫一篇題解
統計路徑?嗯往點分治上想。
把0和1轉化為-1和1,求和完dis為0的路徑就是陰陽平衡的路徑了。
如果題目沒有限制要有中間休息站那就是比較裸的點分治澱粉質題了。
用兩個陣列 f[dis]和g[dis]。
f[dis]:此時dfs的這棵子樹裡到根距離為dis的路徑條數。
g[dis]:此時dfs的這棵子樹外到根距離為dis的路徑條數。
然後裡外配對一下統計答案就可以啦~
如果有休息站也沒複雜到**去。
f[dis][0/1]和g[dis][0/1]多加上一維,表示這條距離為dis的這些路徑上是否到之前某個地方距離和為0。
(有點抽象 畫個圖)
那這時中間的那個點就可以作為中間0點了上面dis的部分再和子樹外的路徑配對即可。
這樣就可以完美統計出答案了。
**~
1 #include2 #include3 #include4 #include5 #include6 #include78#define for(i,a,b) for(register int i=a;i<=b;++i)
9#define dwn(i,a,b) for(register int i=a;i>=b;--i)
10#define re register
11#define pn putchar('\n')
12#define llg long long
13#define f(a,b) fx[a+100000][b]
14#define g(a,b) gx[a+100000][b]
15#define t(a) tx[a+100000]
1617
using
namespace
std;
1819
const
int n=1e5+5;20
21 llg ans=0,fx[n*2][2],gx[n*2][2],tx[n*2
];22
int head[n],nxt[n*2],v[n*2],w[n*2],siz[n],cnt=1;23
inttot,n,m,x,y,opt,vis[n],mx[n],rt;
2425
void read(int &v)
31void add(int ux,int vx,int
wx)37
38void dfsrt(int x,int
fa)46
if(tot-siz[x]>mx[x])mx[x]=tot-siz[x];
47if(mx[x]x;48}
49int getrt(int x,int fa,int
sz)53
54int
mxd;
55void dfssv(int x,int dis,int
fa)64 t(dis)--;65}
66void solve(int
x) 82 for(j,-mxd,mxd)87}
88 for(j,-maxd,maxd)g(j,0)=g(j,1)=0;89
for(re int i=head[x];i;i=nxt[i])94}
9596
intmain()
103int wrt=getrt(1,0
,n);
104solve(wrt);
105 cout
106return0;
107 }
bzoj3697 FJ2014集訓 採藥人的路徑
小道士的矯情之路 點分治,對於每個子樹,處理其內經過根 重心 的路徑,然後遞迴下一層子樹 如何處理經過根的合法路徑 合法有兩個要求 把輸入的0改成 1後 1.len 0 2.存在乙個點i使被她分開的兩個路徑len均為零 在每次統計中我們可以dfs統計每條從根開始的路徑 half way 任意兩條這樣...
P4930 FJ2014集訓 採藥人的路徑
這篇不算題解,是讓自己複習的,什麼都沒說清楚。很久沒有寫點分治了,以前為了趕課件學的太急,板子都沒打對就照著題解寫題,導致學得很不紮實。這道題差不多是在郭老師的指導下一點點湊出來的,還是沒能自己完整寫出一道題,慚愧。這道題大意是 給出一棵邊權為0 1的樹,求滿足以下條件的路徑總數 0的個數等於1的個...
8 1 集訓日記
今天看了有關容斥原理的幾篇部落格。容斥原理的基本思想是 先不考慮重疊的情況,把所有物件的數目求出,然後再把計數時重複計算的數目排斥出去,使得計算的結果既無遺漏又無重複。首先是乙個經典的互素問題 hdoj 4135 co prime 題目大意是 給定a,b,n,求區間 a,b 中與n互素的數的個數。思...