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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bzoj2525 1426

發(fā)布時(shí)間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj2525 1426 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題面二分最短時(shí)間,求出最小的需要引爆數(shù)
至于關(guān)鍵點(diǎn)的引爆狀態(tài)有關(guān)
f[i] 以i為根的子樹中已經(jīng)引爆的點(diǎn)離i最近的距離
g[i] 以i為根的子樹中未引爆的點(diǎn)離i最遠(yuǎn)的距離
回溯到每個(gè)節(jié)點(diǎn)時(shí),優(yōu)先考慮用另一個(gè)兒子中的點(diǎn)覆蓋其他兒子
if(f[i]+g[i]<=mid) g[i]=INF
if(g[i]==mid) 必須引爆x

#include <iostream> #include <cstdio> #include <cstring> #define INF 1000000000 #define maxn 300005 using namespace std; int n,m; int a[maxn]; int ans; struct edge{int to,ne; }b[maxn*2]; int k=0,head[maxn]; int f[maxn],g[maxn]; int limit; int num=0,op1=0; inline int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }return x*f; }void add(int u,int v) {k++;b[k].to=v; b[k].ne=head[u]; head[u]=k; } void dfs(int x,int pre) {f[x]=INF;if(a[x]) g[x]=0;else g[x]=-INF;for(int i=head[x];i!=-1;i=b[i].ne)if(b[i].to!=pre){dfs(b[i].to,x);f[x]=min(f[x],f[b[i].to]+1);g[x]=max(g[x],g[b[i].to]+1);}if(g[x]+f[x]<=limit) g[x]=-INF;if(g[x]==limit){f[x]=0,g[x]=-INF,num++;} }bool check(int x) {if(!x) return op1<=m;limit=x; num=0;dfs(1,0);//printf("%d %d %d %d\n",x,f[1],g[1],num);if(g[1]+f[1]>limit) num++;return num<=m; }void getans() {int l=0,r=n,mid;ans=n;while(l<=r){mid=(l+r)>>1;if(check(mid)) ans=mid,r=mid-1;else l=mid+1;} } int main() {//freopen("in.txt","r",stdin);memset(head,-1,sizeof(head));n=read(); m=read();for(int i=1;i<=n;i++){a[i]=read();if(a[i]) op1++;}int x,y;for(int i=1;i<n;i++){x=read(); y=read();add(x,y); add(y,x);}getans();printf("%d\n",ans);//while(1);return 0; }

題面
考慮逆推
f[i] 已經(jīng)買了i張郵票,距離n張郵票還需要的購(gòu)買次數(shù)

f[i]=in?f[i]+n?in?f[i+1]+1
f[i]=f[i+1]+nn?i
g[i]表示所需錢數(shù)
假設(shè)每張郵票需要一元,后面購(gòu)買的郵票都會(huì)貴1元
g[i]=in?(g[i]+f[i])+n?in?(g[i+1]+f[i+1])+1

總結(jié)

以上是生活随笔為你收集整理的bzoj2525 1426的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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