JZOJ5400. 【NOIP2017提高A组模拟10.7】Repulsed
2017-10-07 20:51
483 查看
Description
小w 心里的火焰就要被熄灭了。简便起见,假设小w 的内心是一棵n -1 条边,n 个节点的树。
现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个。
接下来每个节点都要被分配给一个至多k 条边远的灭火器,每个灭火器最多能分配给s 个节点。
至少要多少个灭火器才能让小w 彻底死亡呢?
题解
感性的理解一下,灭火器应该放在越上面的地方越好。那么就按照深度由大到小来放灭火器。
对于一个节点x,
如果在它的子树中仍存在着距离它k的节点没有灭火器,
那么这些灭火器就一定要在x这个位置分配出去,
因为再上面的节点无法给这些节点分配。
设fx,j 表示在节点x,在x子树里面离想的距离为j的没有被分配到灭火器的节点数量。
设gx,j 表示在节点x,在x子树里面离想的距离为j的所以节点仍多出来的灭火器个数。
gx,k 是一定要在x这个节点分配完的。
lca为x的也一个在这课子树里面匹配完。
code
#include<queue> #include<cstdio> #include<iostream> #include<algorithm> #include <cstring> #include <string.h> #include <cmath> #include <math.h> #define ll long long #define N 100003 #define db double #define P putchar #define G getchar #define mo 998244353 using namespace std; char ch; void read(int &n) { n=0; ch=G(); while((ch<'0' || ch>'9') && ch!='-')ch=G(); ll w=1; if(ch=='-')w=-1,ch=G(); while('0'<=ch && ch<='9')n=(n<<3)+(n<<1)+ch-'0',ch=G(); n*=w; } ll max(ll a,ll b){return a>b?a:b;} ll min(ll a,ll b){return a<b?a:b;} ll abs(ll x){return x<0?-x:x;} void write(ll x){if(x>9) write(x/10);P(x%10+'0');} int n,s,k,nxt[N*2],a[N*2],b ,t; int f [23],g [23],x,y,tot,ans; void ins(int x,int y) { nxt[++tot]=b[x]; a[tot]=y; b[x]=tot; } void dfs(int x,int fa) { for(int i=b[x];i;i=nxt[i]) if(a[i]!=fa) { dfs(a[i],x); for(int j=1;j<=k;j++) g[x][j]+=g[a[i]][j-1],f[x][j]=min(n,f[x][j]+f[a[i]][j-1]); } g[x][0]++; int t=g[x][k]?(g[x][k]-1)/s+1:0; ans+=t;f[x][0]=min(n,(ll)s*t); for(int i=0;i<=k;i++) { t=min(f[x][i],g[x][k-i]); f[x][i]-=t; g[x][k-i]-=t; } for(int i=0;i<k;i++) { t=min(f[x][i],g[x][k-i-1]); f[x][i]-=t; g[x][k-i-1]-=t; } } int main() { freopen("repulsed.in","r",stdin); freopen("repulsed.out","w",stdout); read(n);read(s);read(k); for(int i=1;i<n;i++) read(x),read(y),ins(x,y),ins(y,x); dfs(1,0); for(int i=0;i<=k;i++) for(int j=k;j>=0;j--) if(i+j<=k) { t=min(f[1][i],g[1][j]); f[1][i]-=t; g[1][j]-=t; } t=0; for(int i=0;i<=k;i++) t+=g[1][i]; ans+=t?(t-1)/s+1:0; write(ans); }
相关文章推荐
- jzoj5400. 【NOIP2017提高A组模拟10.7】Repulsed
- JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed
- JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed
- JZOJ5400. 【NOIP2017提高A组模拟10.7】Repulsed 树型DP+贪心
- 【JZOJ 5400】【NOIP2017提高A组模拟10.7】Repulsed
- jzoj5399 【NOIP2017提高A组模拟10.7】Confess
- JZOJ 5398. 【NOIP2017提高A组模拟10.7】Adore
- JZOJ5399. 【NOIP2017提高A组模拟10.7】Confess bitset
- JZOJ 5398. 【NOIP2017提高A组模拟10.7】Adore
- JZOJ 5399. 【NOIP2017提高A组模拟10.7】Confess
- JZOJ5398. 【NOIP2017提高A组模拟10.7】Adore
- JZOJ5385. 【NOIP2017提高A组模拟9.23】Carry
- JZOJ 5397. 【NOIP2017提高A组模拟10.6】Biology
- JZOJ5401. 【NOIP2017提高A组模拟10.8】Star Way To Heaven prim求mst
- 【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见
- 【JZOJ 4933】【NOIP2017提高组模拟12.24】C
- 【JZOJ 5358】【NOIP2017提高A组模拟9.12】BBQ
- JZOJ 5378. 【NOIP2017提高A组模拟9.19】闷声刷大题(60分)
- [JZOJ5390]【NOIP2017提高A组模拟9.26】逗气
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 4000 (Standard IO)