博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4557 侦察守卫
阅读量:5354 次
发布时间:2019-06-15

本文共 1321 字,大约阅读时间需要 4 分钟。

DP

\(F_{i,j}\) 表示处理掉以 \(i\) 为根的子树,并向上支援 \(j\) 格的最小代价

\(j\in [-D,D]\)

暴力转移 \(O(ND^3)\) ~ \(O(ND^2)\)

稍作修改

\(F_{i,j}\) 表示处理掉以 \(i\) 为根的子树,并向上支援至少 \(j\) 格的最小代价

容易得到 \(O(ND)\) 做法

#include 
#include
#include
using std::min;using std::vector;const int MAXN=500111;const int MAXD=23;const int INF=1034567890;int N, D, M;struct Vert{ int Val; bool Is; int FE; int F_[MAXD<<1], *F; Vert(){F=F_+MAXD;}} V[MAXN];struct Edge{ int y, next;} E[MAXN<<1];int Ecnt;void addE(int a, int b){ ++Ecnt; E[Ecnt].y=b;E[Ecnt].next=V[a].FE;V[a].FE=Ecnt;}void DFS(int at, int f){ vector
Son; for(int k=V[at].FE, to;k;k=E[k].next){ to=E[k].y; if(to==f) continue; Son.push_back(to); DFS(to, at); } if(!Son.size()){ for(int i=1-V[at].Is;i<=D;++i) V[at].F[i]=V[at].Val; return; } //j=D; for(int i=0, s=Son.size();i
=-D;--j){ for(int i=0, s=Son.size();i
=-D;--i) V[at].F[i]=min(V[at].F[i+1], V[at].F[i]);}int main(){ scanf("%d%d", &N, &D); for(int i=1;i<=N;++i) scanf("%d", &V[i].Val); scanf("%d", &M); for(int i=1, a;i<=M;++i) {scanf("%d", &a);V[a].Is=true;} for(int i=1, a, b;i

转载于:https://www.cnblogs.com/Pickupwin/p/BZOJ4557.html

你可能感兴趣的文章
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I &amp; II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
response和request
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>
回到顶部浮窗设计
查看>>
C#中Monitor和Lock以及区别
查看>>
【NOIP2017】奶酪
查看>>
$ 一步一步学Matlab(3)——Matlab中的数据类型
查看>>
5.6.3.7 localeCompare() 方法
查看>>
Linux下好用的简单实用命令
查看>>
常用web字体的使用指南
查看>>
描绘应用程序级的信息
查看>>
poj2406-Power Strings
查看>>
2018/12/18 JS会像Linux一样改变编程
查看>>