日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...

發(fā)布時間:2025/6/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

HDU 5861

題意

在n個村莊之間存在n-1段路,令某段路開放一天需要交納wi的費用,但是每段路只能開放一次,一旦關(guān)閉將不再開放。現(xiàn)在給你接下來m天內(nèi)的計劃,在第i天,需要對村莊ai到村莊bi的道路進行開放。在滿足m天內(nèi)花費最小的情況下,求出每天的花銷。

?

分析:

我們可以想到用線段樹想到記錄每一段路的開始時間與結(jié)束時間,開始時間很簡單,就是一開始的時間,結(jié)束的時間求法可以參考區(qū)間覆蓋,這是類似的;

然后我們在轉(zhuǎn)化哪一天開哪些,哪一天關(guān)哪些,那這天的貢獻sum = 開-關(guān) ;

?

這很關(guān)鍵,我在比賽就沒有想出來。。? ?

例:如st[1]=3,表示第1段道路的最早開始時間是第3天,那么你可以start[3].push_back(1),表示第3天開啟第1段道路,這樣掃一遍過去就行了;

這是一種,要不就用d[be[i]]+=w[i] , d[en[i]]-=w[i];? 其實差不多

?

#include<bits/stdc++.h>using namespace std ; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn = 200020; int Begin[maxn << 2], End[maxn << 2]; int be[maxn],en[maxn],w[maxn]; long long sum[maxn],d[maxn]; void pushdown(int rt)//向下跟新 {if(!Begin[rt<<1])Begin[rt<<1]=Begin[rt];if(!Begin[rt<<1|1])Begin[rt<<1|1]=Begin[rt];if(!End[rt])return ;End[rt<<1]=End[rt<<1|1]=End[rt];End[rt]=0;///優(yōu)化用過了就可以不用了 } void build(int l , int r , int rt) {Begin[rt]=End[rt]=0;if(l==r)return ;int m = (l+r) >> 1 ;build(lson);build(rson); }void update(int L , int R , int k , int l , int r , int rt) {if(L<=l && r<=R){if(!Begin[rt])///很簡單的道理,我跟新過了就不跟新了;Begin[rt]=k;End[rt]=k;return ;}pushdown(rt);int m=(l+r) >> 1;if(m>=L)update(L,R,k,lson);if(m<R)update(L,R,k,rson); } void pushall(int l , int r , int rt) {if(l==r){be[l]=Begin[rt],en[l]=End[rt];return ;}pushdown(rt);int m=(l+r)>>1;pushall(lson);pushall(rson); } int main() {int n,m;while(~scanf("%d%d",&n,&m)){n--;build(1,n,1);///建樹for(int i=1 ; i<=n ; i++)scanf("%d",&w[i]);for(int i=1 ; i<=m ; i++){int u,v;scanf("%d%d",&u,&v);if(u>v)//防止意外 swap(u,v);update(u,v-1,i,1,n,1);///u到v區(qū)間更新為i(天); }pushall(1,n,1);//找到每一段路的開始時間與結(jié)束時間memset(d,0,sizeof(d));for(int i=1 ; i<=n ; i++)//每一段路的開始費用與結(jié)束費用 {if(be[i]){d[be[i]]+=w[i];d[en[i]+1]-=w[i];}}sum[0]=0;for(int i=1 ; i<=m ; i++)///類似與掃描線,一天一天的掃過去 {sum[i]=sum[i-1]+d[i];printf("%lld\n",sum[i]);}} } View Code

?

線段樹真厲害,以后就不要只是固定與模板,要與線段樹的結(jié)構(gòu)與自己需要用的功能結(jié)合

轉(zhuǎn)載于:https://www.cnblogs.com/shuaihui520/p/9795013.html

總結(jié)

以上是生活随笔為你收集整理的2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。