洛谷 P1505 國家集訓隊 旅遊 解題報告

2022-04-30 01:30:18 字數 2819 閱讀 2983

\(\tt\) 樂忠於旅遊,這次他來到了\(t\)城。\(t\)城是乙個水上城市,一共有 \(n\) 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,\(t\) 城的任意兩個景點之間有且只有一條路徑。換句話說, \(t\) 城中只有 \(n − 1\) 座橋。

\(\tt\) 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥濘,令人煩躁。於是,他給每座橋定義乙個愉悅度\(w\),也就是說,\(\tt\) 經過這座橋會增加\(w\)的愉悅度,這或許是正的也可能是負的。有時,\(\tt\) 看待同一座橋的心情也會發生改變。

現在,\(\tt\) 想讓你幫他計算從\(u\)景點到\(v\)景點能獲得的總愉悅度。有時,他還想知道某段路上最美麗的橋所提供的最大愉悅度,或是某段路上最糟糕的一座橋提供的最低愉悅度。

輸入的第一行包含乙個整數\(n\),表示\(t\)城中的景點個數。景點編號為 \(0\dots n − 1\)。

接下來 \(n − 1\) 行,每行三個整數\(u\)、\(v\) 和\(w\),表示有一條 \(u\) 到 \(v\),使 \(\tt\) 愉悅度增加 \(w\) 的橋。橋的編號為\(1\dots n − 1\)。\(|w| \le 1000\)。 輸入的第 \(n + 1\) 行包含乙個整數\(m\),表示 \(\tt\) 的運算元目。

接下來有 \(m\) 行,每行描述了乙個操作,操作有如下五種形式:

測試資料保證,任意時刻,\(\tt\) 對於經過每一座橋的愉悅度的絕對值小於等於\(1000\)。

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

樹鏈剖分模板題,掛了好多個小時簡直自閉了。

奇怪的錯誤點:

read()沒讀負數,最開始忘記生成負資料了一直拍不出來

若前向星的邊的編號除2得到原始編號,應該從2開始編號,隨機生成樹的時候沒打亂邊的順序沒拍出來。

code:

#include #include const int n=2e5+10;

int head[n],to[n<<1],edge[n<<1],next[n<<1],cnt=1;

void add(int u,int v,int w)

int read()

while(isdigit(c))

return x*f;

}int num[n],dtp[n],ha[n],top[n],f[n],dfn[n],dep[n],siz[n],ws[n],dfs_clock=-1;

void dfs1(int now)

}}void dfs2(int now,int anc)

int sum[n<<2],mx[n<<2],mi[n<<2],tag[n<<2],tot,tmp;

int n,m;char op[6];

#define ls id<<1

#define rs id<<1|1

int max(int x,int y)

int min(int x,int y)

void rev(int id)

void pushdown(int id)

}void change(int id,int l,int r,int p,int d)

pushdown(id);

int mid=l+r>>1;

if(p<=mid) change(ls,l,mid,p,d);

else change(rs,mid+1,r,p,d);

updata(id);

}void reverse(int id,int l,int r,int l,int r)

pushdown(id);

int mid=l+r>>1;

if(r<=mid) reverse(ls,l,mid,l,r);

else if(l>mid) reverse(rs,mid+1,r,l,r);

else reverse(ls,l,mid,l,mid),reverse(rs,mid+1,r,mid+1,r);

updata(id);

}void modify(int x,int y)

else

}if(dep[x]>1;

if(r<=mid) return querys(ls,l,mid,l,r);

else if(l>mid) return querys(rs,mid+1,r,l,r);

else return querys(ls,l,mid,l,mid)+querys(rs,mid+1,r,mid+1,r);

}int querysum(int x,int y)

else

}if(dep[x]>1;

if(r<=mid) return querymi(ls,l,mid,l,r);

else if(l>mid) return querymi(rs,mid+1,r,l,r);

else return min(querymi(ls,l,mid,l,mid),querymi(rs,mid+1,r,mid+1,r));

}int querymin(int x,int y)

else

}if(dep[x]>1;

if(r<=mid) return querymx(ls,l,mid,l,r);

else if(l>mid) return querymx(rs,mid+1,r,l,r);

else return max(querymx(ls,l,mid,l,mid),querymx(rs,mid+1,r,mid+1,r));

}int querymax(int x,int y)

else

}if(dep[x]2018.11.5

洛谷 P1505 國家集訓隊 旅遊

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

P1505 國家集訓隊 旅遊

題目鏈結 這道題其實還是比較好想的,同樣是邊權問題。我們需要維護最大值,最小值,和。最坑的地方就是路徑上的所有數變相反數,其實這個就是把區間和 1,區間最大 1,區間最小 1,最後pushdown的時候將取反標記 1,接下來一系列都是常規操作。而這裡還要記住,單點修改時也要下傳lazy標記。而我在跳...

P1505 國家集訓隊 旅遊

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