hdu 4729 樹鏈剖分 二分

2021-06-18 18:32:00 字數 1997 閱讀 9498

此題一看就知道是樹鏈剖分,模板題!可憐我模板少抄個字母,在這兩百多行的**裡找bug找了三個多小時啊!!!!

解題思路:對於要求的x,y點,先可以求得不加任何操作的最大流量p,c1為建造乙個路的話費,c2為增加乙個容量的花費,如果c1<=c2,那麼結果就為p+k/c1。

否則,如果先建一條路,那麼最大的流量是m=p+1+(k-c1)/c2,如果不新建路只加邊呢?那就可以二分求得最大的結果

,為了節省時間,可以對整體進行最小值為m的二分結果。

下面是我的**,不是很簡單,但是各個函式還算清晰了。。。。

#pragma comment(linker,"/stack:124000000,124000000")

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define rep(i,n) for(int i=0; i=(m); --i)

#define ll __int64

#define arc(a) ((a)*(a))

#define inf 100000

#define exp 0.000001

#define n 200005

class match;

node a[n];

struct no;

no aa[n*4];

void init()

void addpage(int x,int y,int z)

void dfs(int s,int faa,int h)

if(max!=0) son[s]=sign;

} void dfs2(int s,int faa,int tp)

lit[s]=topw-1;

} void bulidtree(int s,int l,int r)

int mid=(l+r)/2;

bulidtree(2*s,l,mid);

bulidtree(2*s+1,mid+1,r);

aa[s].min=min(aa[2*s].min,aa[2*s+1].min);

} int refresh(int s,int l,int r)

int deal(int s,int x,int y)

if(dep[x]>dep[y])

swap(x,y);

if(x!=y)

min=min(min,refresh(1,w[x]+1,w[y]));

if(min==int_max)

min=9999;

return min;

} bool true(int s,int l,int r,ll mid)

int mi=(aa[s].l+aa[s].r)/2;

if(r<=mi) return true(2*s,l,r,mid);

else if(l>mi) return true(2*s+1,l,r,mid);

if(true(2*s,l,r,mid) && true(2*s+1,l,r,mid))

return true;

return false;

} bool fun(int s,int x,int y,ll mid)

if(dep[x]>dep[y]) swap(x,y);

if(x!=y)

if(!true(1,w[x]+1,w[y],mid))

return false;

return true;

}};match sa;

int n,m;

int main()

sa.dfs(1,-1,1);

sa.dfs2(1,-1,1);

sa.bulidtree(1,1,n);

printf("case #%d:\n",ror);

repf(i,1,m)

}printf("%i64d\n",ans);

// cout<

hdu 4729 樹鏈剖分

思路 這個樹鏈剖分其實還是比較明顯的。將邊按權值排序後插入線段樹,然後用線段樹查詢區間中比某個數小的數和,以及這樣的數的個數。當a b時,就全部建新的管子。對於a b的情況比較 建一條由s t的管子後將這根管子容量擴到最大能得到的容量 與 將所有預算都用來擴大管子容量不建新管子得到的最大容量 做比較...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 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...

HDU3966 樹鏈剖分

題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...