此題一看就知道是樹鏈剖分,模板題!可憐我模板少抄個字母,在這兩百多行的**裡找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的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...