BZOJ 2157 旅遊 樹鏈剖分

2021-07-30 19:47:12 字數 2857 閱讀 6756

ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說, t 城中只有n − 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥濘,令人煩躁。於是,他給每座橋定義乙個愉悅度w,也就是說,ray 經過這座橋會增加w 的愉悅度,這或許是正的也可能是負的。有時,ray 看待同一座橋的心情也會發生改變。現在,ray 想讓你幫他計算從u 景點到v 景點能獲得的總愉悅度。有時,他還想知道某段路上最美麗的橋所提供的最大愉悅度,或是某段路上最糟糕的一座橋提供的最低愉悅度。

輸入的第一行包含乙個整數n,表示t 城中的景點個數。景點編號為 0...n − 1。接下來n − 1 行,每行三個整數u、v 和w,表示有一條u 到v,使 ray 愉悅度增加w 的橋。橋的編號為1...n − 1。|w| <= 1000。輸入的第n + 1 行包含乙個整數m,表示ray 的運算元目。接下來有m 行,每行描述了乙個操作,操作有如下五種形式: c i w,表示ray 對於經過第i 座橋的愉悅度變成了w。 n u v,表示ray 對於經過景點u 到v 的路徑上的每一座橋的愉悅度都變成原來的相反數。 sum u v,表示詢問從景點u 到v 所獲得的總愉悅度。 max u v,表示詢問從景點u 到v 的路徑上的所有橋中某一座橋所提供的最大愉悅度。 min u v,表示詢問從景點u 到v 的路徑上的所有橋中某一座橋所提供的最小愉悅度。測試資料保證,任意時刻,ray 對於經過每一座橋的愉悅度的絕對值小於等於1000。

對於每乙個詢問(操作s、max 和min),輸出答案。

#include#include#include#includeusing namespace std;

const int maxn=20005;

const int inf=999999999;

struct edgee[maxn*5],e[maxn*5];

struct xdtreea[maxn*10];

int tot[maxn],dep[maxn],ys[maxn],num=0,top[maxn],son[maxn],fa[maxn];

int last[maxn],len=0;

int n,q;

void ins(int x,int y,int d)

void work1(int x,int fa)

}void change1(int now,int l,int r)

int lc=a[now].lc,rc=a[now].rc,mid=a[now].l+a[now].r>>1;

if(a[now].ff==true)

if(r<=mid) change1(lc,l,r);

else if(l>mid) change1(rc,l,r);

else change1(lc,l,mid),change1(rc,mid+1,r);

a[now].sum=a[lc].sum+a[rc].sum;

a[now].mx=max(a[lc].mx,a[rc].mx);

a[now].mn=min(a[lc].mn,a[rc].mn);

}void change(int now,int x,int k)

int mid=a[now].l+a[now].r>>1,lc=a[now].lc,rc=a[now].rc;

if(a[now].ff==true)

if(x<=mid) change(lc,x,k);

else change(rc,x,k);

a[now].sum=a[lc].sum+a[rc].sum;

a[now].mx=max(a[lc].mx,a[rc].mx);

a[now].mn=min(a[lc].mn,a[rc].mn);

}int findmx(int now,int l,int r)

if(r<=mid) return findmx(lc,l,r);

else if(l>mid) return findmx(rc,l,r);

else return max(findmx(lc,l,mid),findmx(rc,mid+1,r));

}int findmn(int now,int l,int r)

if(r<=mid) return findmn(lc,l,r);

else if(l>mid) return findmn(rc,l,r);

else return min(findmn(lc,l,mid),findmn(rc,mid+1,r));

}int getsum(int now,int l,int r)

if(r<=mid) return getsum(lc,l,r);

else if(l>mid) return getsum(rc,l,r);

else return getsum(lc,l,mid)+getsum(rc,mid+1,r);

}int smx(int x,int y)

if(x==y) return ans;

else

}int smn(int x,int y)

if(x==y) return ans;

else

}int gsum(int x,int y)

if(x==y) return ans;

else

}void change(int x,int y)

if(x!=y)

}int main()

//for(int i=1;i<=trlen;i++) printf("%d %d %d %d %d %d\n",i,a[i].l,a[i].r,a[i].mx,a[i].mn,a[i].sum);

for(int i=1;i<=q;i++)

}

BZOJ2157 旅遊 樹鏈剖分

ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥...

BZOJ2157 旅遊,樹鏈剖分練習

傳送門 寫在前面 模擬賽中ca爺卡我記憶體,暴力100變60 不過還是親學長 畢竟在我初中的時候就是學長 每次做ca爺的題都是高分 思路 迄今做的最爽的樹鏈剖分 被char哥帶著做這道題,結果耗了好久時間調好,這應該是第一次寫邊鏈剖了?與點鏈剖不同的是要處理下邊 深度大的變成入點 然後建樹時,這個入...

BZOJ2157旅遊 樹鏈剖分 線段樹

ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥...