topcoder13185 TreePuzzle
https://community.topcoder.com/stat?c=problem_statement&pm=13185
被wck屠了。
考试时候想分类讨论,结果发现情况有点复杂,最后还是没调出来。
回去看了看题解,发现好像是树形DP,状态记得很巧妙。
假设当前红点在$x$,从$fa$来,容易知道此时$fa$是空的。
容易知道以$fa$为根的子树(即如图的绿色圈)中的黑点是可以任意移动的。
因为$fa$是空的,所以我们可以先把红点从$x$移到$fa$,然后将以$x$为子树中的所以黑点任意移动,最后再把红点从$fa$移到$x$。
所以以$x$为根的子树(即如图的蓝色圈)中的黑点也是可以任意移动的。
所以我们只需要知道以$x$为根的子树中的黑点的个数即可。
记$vis[x][fa][c]$表示当前红点在$x$,从$fa$来,且以$x$为根的子树中的黑点的个数为$c$的状态,$1$表示可以到达这种状态,$0$表示不可以到达这种状态。
然后DP即可。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define p_b(a) push_back(a)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(abs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=; int n;
int d[maxn+],g[maxn+][maxn+];
int mark[maxn+];
int sz[maxn+][maxn+];//sz[i][j]表示i的父亲为j时,子树i的大小
int bl[maxn+];
int res[maxn+]; void addedge(int u,int v){g[u][++d[u]]=v;} int calsz(int x,int fa)
{
int &res=sz[x][fa],j;
if(res)return res;
res=;
re(j,,d[x])if(g[x][j]!=fa)res+=calsz(g[x][j],x);
return res;
}
int calbl(int x,int fa)
{
int &res=bl[x],j;
res=mark[x];
re(j,,d[x])if(g[x][j]!=fa)res+=calbl(g[x][j],x);
return res;
} queue<int>Q;
int vis[maxn+][maxn+][maxn+];
void push(int x,int fa,int c)
{
if(vis[x][fa][c])return;
vis[x][fa][c]=;
Q.push((x<<)|(fa<<)|c);
} int main()
{
freopen("puzzle.in","r",stdin);
freopen("puzzle.out","w",stdout);
int i,j;
n=gint();
re(i,,n){int fa=gint()+;if(fa)addedge(fa,i),addedge(i,fa);}
re(i,,n)re(j,,d[i])calsz(i,g[i][j]);
re(i,,n)mark[i]=gint();mark[]=;
calbl(,-);
int total=bl[];
re(j,,d[])
{
int v=g[][j];
if(sz[v][]>bl[v])push(v,,bl[v]);
}
res[]=;
while(!Q.empty())
{
int status=Q.front(),x=status>>,fa=(status>>)&,c=status&;Q.pop();//当前红点在x,从fa来,子树内的黑点数为c
res[x]=;
if(total-c<sz[fa][x])push(fa,x,total-c);
int sc=;
re(j,,d[x])if(g[x][j]!=fa)sc+=sz[g[x][j]][x];
re(j,,d[x])if(g[x][j]!=fa)
{
int v=g[x][j];
for(int c2=;c2<=c && c2<sz[v][x];c2++)if(c-c2<=sc-sz[v][x])push(v,x,c2);
}
}
re(i,,n)PF("%d ",res[i]);PF("\n");
return ;
}
topcoder13185 TreePuzzle的更多相关文章
- TreePuzzle 一点感想
题目链接 这一道题看起来像是一道贪心的水题,但是情况较难考虑周全,比如下图,我就考虑漏了这种情况,点0是可以移动到点1的.然后我就各种奇怪的分类讨论.最终还是没能A,决定放弃治疗. 然后我看了看解答, ...
随机推荐
- FACTORY设计模式【让吃货也能理解的程序】
一个人要有思想,技术再牛的人,如果没有一点点文化气氛,那么也是个码农,不能追到女朋友滴. 我这个人文化真心不多,但是比较喜欢读古诗文.虽然读完之后,记在脑海里的不多,不过,就讨一个喜欢[读]. Lee ...
- 【待解决】编译V8引擎出错-snapshot.cc
这几天学习nodejs,翻阅官网的API文档.看到nodejs插件时,想了解一下v8的实现机制,于是我便从GitHub社区克隆了一份v8源码库.哪知道,编译安装的时候就出了问题,这问题已经折磨我两天了 ...
- wp-content-index文章目录插件使用效果调整
安装好wp-content-index后进行如下设置: 其中标红处必须标红,用于检索锚点.在文章页面添加如下js代码: $(function() { var wpindex = $("#co ...
- 《CODE》讲了什么?
本书首先从黑夜中用手电筒开关灯的方式来与小伙伴交流从而引出了编码与组合的概念,并阐明了编码的本质就是交流,是一种用来在机器与人之间传递信息的方式.然后在第 2~3 章中讲述了编码与组合的应用,如电报机 ...
- yii 验证码那点事儿
今天要使用yii验证码, 不过, 这个验证码是整站通用的, 也就是说, 有个表单的提交是使用ajax方式来提交, 整站, 不管在哪个地方, 都能点出来此窗口, 来提交信息 关于yii验证码, fram ...
- Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)
Python开发[第七篇]:面向对象 详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)> ...
- Android缓存技术
android应用程序中 1. 尽可能的把文件缓存到本地.可以是 memory,cache dir,甚至是放进 SD 卡中(比如大的图片和音视频). 可以设置双重缓冲,较大的图片或者音频放到SD ...
- DataSet离线数据集实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- Have trouble in your life
当你烦恼的时候不知道如何是好时,你可以下载此程序,可以帮助你化解烦恼! 下载地址: http://pan.baidu.com/s/1i3FtxHF
- cenos6.5 64位下PHP远程连接sql server2008成功案例
准备工作: 1.sql server2008服务器(开放远程端口,默认为1433,我用的是192.168.1.129) 2.安装好php的centos服务器 步骤: 1.php安装mssql扩展.ce ...