BZOJ4557:[JLOI2016/SHOI2016]偵察守衛——題解

https://www.lydsy.com/JudgeOnline/problem.php?id=4557

小R和B神正在玩一款游戲。這款游戲的地圖由N個點和N-1條無向邊組成,每條無向邊連接兩個點,且地圖是連通的。換句話說,游戲的地圖是一棵有N個節點的樹。

游戲中有一種道具叫做偵查守衛,當一名玩家在一個點上放置偵查守衛后,它可以監視這個點以及與這個點的距離在D以內的所有點。這里兩個點之間的距離定義為它們在樹上的距離,也就是兩個點之間唯一的簡單路徑上所經過邊的條數。在一個點上放置偵查守衛需要付出一定的代價,在不同點放置守衛的代價可能不同。

現在小R知道了所有B神可能會出現的位置,請你計算監視所有這些位置的最小代價。

dp狀態很好想,但是這個式子我菜我是真的推不出來,其他的巨佬切題的速度嘆為觀止,只能感嘆我的智商擺在這里。

參考:https://www.luogu.org/blog/zcysky/solution-p3267

一眼是個樹形dp,二眼$d$很小,可以直接做成一維狀態,那么直接設$f[i][j]$為$i$子樹從$i$往下$j$層都沒有覆蓋的代價,$g[i][j]$為$i$的子樹全覆蓋,往上還可以覆蓋$j$層的代價。二者正好是互補的。

(PS:層數也包括i本身,換句話說,$j=0$時$i$并沒有被覆蓋,我在這里糾結了很久。)

(PPS:既然$g[i][j]$都可以覆蓋上$j$層,那它也能覆蓋下$j$層。)

之后對于dp式子慢慢剖析因為我自己都云里霧里的

邊界就是當點$u$為關鍵點時$f[u][0]=g[u][0]=w[u]$這個點一定是要放一個的,如果不是的話顯然我們就不需要放了,初值為0。

?

初始化就不說了。

對于每個兒子結點v,我們有:

$g[u][j]=min(g[u][j]+f[v][j],g[v][j+1]+f[u][j+1])$(所以明白f和g是互補的才能看懂)

當然也有可能出現這種的:$g[u][j]=min(g[u][j],g[u][j+1])$

推完g來推f,首先$f[u][0]=g[u][0]$因為此時二者狀態等價。

然后顯然的,$f[u][j]+=f[v][j-1]$

以及也有可能出現這種的:$f[u][j]=min(f[u][j],f[u][j-1])$

(所以其實核心還是在狀態含義上而非式子,含義搞懂式子就很顯然了。)

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+5;
const int D=21;
const int INF=1e9;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct node{int to,nxt;
}e[N*2];
int n,d,m,cnt,head[N],w[N];
int f[N][D],g[N][D];
bool im[N];
inline void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
void dfs(int u,int fa){if(im[u])f[u][0]=g[u][0]=w[u];for(int i=1;i<=d;i++)g[u][i]=w[u];g[u][d+1]=INF;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa)continue;dfs(v,u);for(int j=d;j>=0;j--)g[u][j]=min(g[u][j]+f[v][j],g[v][j+1]+f[u][j+1]);for(int j=d;j>=0;j--)g[u][j]=min(g[u][j],g[u][j+1]);f[u][0]=g[u][0];for(int j=1;j<=d+1;j++)f[u][j]+=f[v][j-1];for(int j=1;j<=d+1;j++)f[u][j]=min(f[u][j],f[u][j-1]);}
}
int main(){n=read(),d=read();for(int i=1;i<=n;i++)w[i]=read();m=read();for(int i=1;i<=m;i++)im[read()]=1;for(int i=1;i<n;i++){int u=read(),v=read();add(u,v);add(v,u);}dfs(1,0);printf("%d\n",f[1][0]);return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

轉載于:https://www.cnblogs.com/luyouqi233/p/9193761.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277784.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277784.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mac系統下Homebrew的安裝和使用Homebrew安裝python

這里向大家推薦一個東西&#xff0c;Mac下很好用的東西&#xff0c;叫做Homebrew。剛開始接觸Mac的時候&#xff0c;我也沒聽過這個東西&#xff0c;但裝了以后真的覺得&#xff0c;TMD太碉堡了。引用一句話&#xff1a;Homebrew is the easiest and most flexible way to inst…

JS中的深拷貝

前言&#xff1a;我們經常會遇到想要將一個對象為己所用&#xff0c;但又不能污染原對象的需求&#xff0c;這就涉及到了js對象的深拷貝。 比如說在VUE的子組件中&#xff0c;父組件傳過來的數據中若是有對象&#xff0c;而子組件需要用父組件的數據進行初始化并且有另做他用的…

Mac下cocos2dx-3.2+Xcode環境配置和項目創建

這是有關環境配置的第二篇教程&#xff0c;第一篇講的是win8下的環境配置。這里我們使用C。所有如果你用其他語言如Lua和js進行cocos2d開發&#xff0c;那么可以再找一找其他的配置文檔。下面要說Mac os 下 cocos2dx-3.2Xcode的環境配置&#xff0c;這里我使用的是Xcode 5.1.1。…

對flex-grow和flex-shrink的深入理解

flex彈性布局&#xff0c;如果子元素寬度之和大于或者小于父元素寬度&#xff0c;空間就會存在剩余和不夠&#xff0c;flex默認不換行&#xff0c;除非設置flex-wrap,那么這種情況下&#xff0c;有兩個重要的屬性&#xff0c;flex-grow和flex-shrink. flex-grow默認值為0&#…

拿下京東榜單第五首戰告捷,看聯想手機如何上演王者歸來

618對于手機行業來說是一個非常重要的日子&#xff0c;京東618上銷量的高低在某種程度上就代表了該手機品牌在國內市場的影響力&#xff0c;以及在行業中所處的位置。因此&#xff0c;今年的618各大手機品牌卯足了勁在京東平臺上展開較量。榮耀、小米、VIVO、OPPO等手機品牌相繼…

Mac OS使用技巧之一:查看Finder中的.bash_profile等系統隱藏文件

作為一個程序員&#xff0c;經常要配置變量&#xff0c;可能要更改hosts文件&#xff0c;或者你閑著沒事兒尋找homebrew給你安裝的東西在什么地方。Mac OS的內核是Unix&#xff0c;Linux/Unix系統出于系統安全和用戶安全的考慮&#xff0c;會把一些與系統相關的文件隱藏&#x…

java.lang.NumberFormatException: For input string: “name”

背景&#xff1a;action中查詢出list數據需要在前臺進行顯示&#xff0c;但根據主鍵在數據庫中查詢出的數據list中含有熟悉alist屬性為配置表&#xff0c;且支持用戶多選&#xff0c;前端通過el表達式顯示 前臺界面為&#xff1a;<c:forEach items"${list}" var&q…

win8下cocos2dx3.2移植android平臺及代碼打包APK

cocos2dx程序不能只在VS2012下運行&#xff0c;遲早是要搬運到Android和IOS上的。Windows下移植IOS平臺先擱下不說比較困難&#xff0c;而且只有越獄的蘋果機才可以運行&#xff0c;而且畢竟IOS高端、小眾。這里主要講一下移植Android&#xff0c;windows下cocos2dx打包成APK和…

【轉】用Fiddler做抓包分析詳解

1.為什么是Fiddler? 抓包工具有很多&#xff0c;小到最常用的web調試工具firebug&#xff0c;達到通用的強大的抓包工具wireshark.為什么使用fiddler?原因如下&#xff1a; a.Firebug雖然可以抓包&#xff0c;但是對于分析http請求的詳細信息&#xff0c;不夠強大。模擬http…

讀《活著》----余華

這本書所處時代背景盡管與我生活的時代背景不同&#xff0c;但是我仍是被人物的生活所打動。這本書為我們描述了一個擁有一百畝的闊少爺徐福貴因為賭而輸掉全部家產&#xff0c;到經歷將自己的父親&#xff0c;母親&#xff0c;兒子&#xff0c;女兒&#xff0c;女媳&#xff0…

常用數據庫連接和diriver以及默認端口

sqlserver默認端口號為&#xff1a;1433 URL:"jdbc:microsoft:sqlserver://localhost:1433;DatabaseNamedbname" DRIVERNAME:"com.microsoft.jdbc.sqlserver.SQLServerDriver"; mysql 默認端口號為&#xff1a;3306 URL:jdbc:mysql://localhost:3306/…

Mac下cocos2dx3.2移植android平臺詳細教程

本文是cocos2dx移植android的第二篇教程&#xff0c;筆者深深感覺&#xff0c;cocos2dx移植android平臺是永遠的痛啊。。。下面講一下筆者花費一個周研究的Mac OS下的cocos2dx3.2android配置首先要準備的東西&#xff08;1&#xff09;下載cocos2dx3.2 http://www.cocos2d-x.o…

robotframework(12)修改用戶密碼(從數據庫查詢短信驗證碼)

一、testcase&#xff1a;修改用戶密碼需要6個參數&#xff08;短信驗證碼、設置的新密碼、用戶已登錄的userid及用戶唯一標識、接口校驗碼、被修改的手機號&#xff09;&#xff0c;故先準備這些參數 二、用戶登錄請求&#xff0c;&#xff08;獲取userid、用戶唯一標識&#…

Mac OS使用技巧之二:修改變量Path解決android: command not found

前一陣子&#xff0c;一直在搞Mac OS和win8下cocos2dx移植android平臺的方法。一步步從無到有的慢慢摸索出來。最近發現了一個小問題&#xff0c;有關環境變量配置的寫下來分享給大家。就是我們在windows8下查看已有android SDK的版本&#xff0c;需要在CMD里面輸入&#xff1a…

Jenkins架構

一. Master 和slave.下圖闡述了master-slave交互的架構&#xff1a;在上面這個分布式的構建環境中&#xff0c;Jenkins master主要負責如下&#xff1a;接收構建觸發&#xff08;比如&#xff0c;一個提交到GitHub后&#xff09;發送通知&#xff08;比如&#xff0c;在構建失敗…

【linux】linux命令如何查看文件、文件夾的屬性,包括大小、修改時間、誰修改的...

【linux命令如何查看文件、文件夾的屬性&#xff0c;包括大小、修改時間、誰修改的】1、查看文件大小&#xff1a;#du -sh filename2、查看文件,文件夾屬性&#xff1a;#ls -l filename#ls -ld foldername3、查看文件的三個時間 atime ,ctime, mtime3.1、 mtime(modification t…

Mac OS使用技巧之三:發射無線網絡信號的方法

許多人知道在windows下可以直接借助各種輔助軟件來直接發射wifi信號&#xff0c;比如360wifi&#xff0c;獵豹wifi。或者可以直接在命令行里面設置。許多人卻不知道Mac系統也有方便快捷發射無線信號的功能。下面講一下利用Mac OS發射無線網絡信號的方法。前提&#xff1a;你的電…

關于基本工作素養在職場當中的重要性

各位小伙伴&#xff1a; 今天博主就和大家分享一下&#xff0c;一個優秀的工作素養在職場中的重要性&#xff0c;中央軍軍容軍紀整潔&#xff0c;隊伍有條有理&#xff0c;為何地方軍閥&#xff0c;層次不窮&#xff0c;惡習滿貫。其核心根本就是職業素養低。 大家都是干技術的…

紀實:對CSDN博客系統的一些質疑

我是一個對編程充滿熱情的在校大學生&#xff0c;本來我是懷著滿腔熱情來到CSDN寫博客&#xff0c;記錄和分享自己的學習經歷。卻被這糟糕的博客系統一次次的潑冷水。寫這篇博客確實是因為心中十分不甘和特別生氣&#xff0c;所以我決定要把自己的遭遇寫出來&#xff0c;我自己…

php框架之laravel

常見問題: 1. 訪問網站500錯誤 這是因為laravel的緩存路徑沒有找到 laravel緩存文件路徑是在 config/cache.php中設置&#xff0c;默認存在storage文件夾中 解決:需要保證storage/framework下面創建 sessions&#xff0c; views, cache 文件夾并確保可寫權限 轉載于:https://ww…