BZOJ5232[Lydsy2017省队十连测] 好题
原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5232
好题
Description
每个人心中对于好题的定义不同,对于小火车来说所谓的好题就是很有趣的题。
有一棵n个节点的树,每个节点都有一种颜色,请找出最小的连通块使得其中的点至少有k种不同的颜色。
Input
第一行两个整数n和k,含义如题所示。
第二行n个正整数,第i个整数表示第i个点的颜色。
接下来n-1行每行两个整数表示一条边。
n<=10000,k<=5,颜色<=n
Output
一行一个整数表示最小的含有至少k个颜色的连通块大小,保证一定存在解。
Sample Input
5 3
1 4 4 2 3
1 2
2 3
3 4
2 5
Sample Output
3
题解
把所有颜色随机映射到1∼k1\sim k1∼k里,多做几次404040分的状压dpdpdp,不断取minminmin,每次答案正确的几率是k!kk\frac{k!}{k^k}kkk!,所以大概404040次就出来了。
但非酋是不信这种东西的:
代码
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int M=1e4+5;
int head[M],nxt[M<<1],to[M<<1],dp[M][70],col[M],cnt,n,p,ans,mx,tot,final=inf;
vector<int>blo[M];
void add(int f,int t){nxt[++cnt]=head[f],head[f]=cnt,to[cnt]=t;}
void dfs(int v,int f)
{dp[v][1<<col[v]-1]=1;for(int i=head[v];i;i=nxt[i]){if(to[i]==f)continue;dfs(to[i],v);for(int j=0;j<=mx;++j){if((j&(1<<col[v]-1))&&dp[v][j]!=inf)for(int k=0;k<=mx;++k)if(dp[to[i]][k]!=inf)dp[v][j|k]=min(dp[v][j|k],dp[v][j]+dp[to[i]][k]);if(__builtin_popcount(j)>=p)ans=min(ans,dp[v][j]);}}
}
void reset()
{ans=inf;for(int i=1;i<=n;++i)for(int j=0;j<=mx;++j)dp[i][j]=inf;for(int i=1,j,now;i<=tot;++i)for(now=rand()%p+1,j=blo[i].size()-1;j>=0;--j)col[blo[i][j]]=now;
}
void in()
{scanf("%d%d",&n,&p);for(int i=1,a;i<=n;++i)scanf("%d",&a),blo[a].push_back(i),tot=max(tot,a);for(int i=1,x,y;i<n;++i)scanf("%d%d",&x,&y),add(x,y),add(y,x);
}
void ac(){mx=(1<<p)-1;for(int i=1;i<=40;++i)reset(),dfs(1,0),final=min(final,ans);printf("%d",final);}
int main(){srand(1000000009);in(),ac();}
BZOJ5232[Lydsy2017省队十连测] 好题相关推荐
- BZOJ5243 : [Lydsy2017省队十连测]绝版题
要找的就是这棵树的带权重心,以带权重心为根时每棵子树的权值和不超过总权值和的一半. 因此按$\frac{v[i]}{\sum v[i]}$的概率随机选取一个点$x$,则重心有$\frac{1}{2}$ ...
- bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树
[Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 93 Solved: 53 [Submit][Status ...
- BZOJ5217: [Lydsy2017省队十连测]航海舰队
被FFT的空间卡了半天 后来发现根本不用开那么大- 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串匹配 ...
- [Lydsy2017省队十连测]航海舰队
SOL: 我们用FFT匹配字符串. 不知道为什么我的NTT挂了,贴一个别人的FFT. #include<bits/stdc++.h> #define ll long long #defin ...
- BZOJ5217: [Lydsy2017省队十连测]航海舰队 FFT
被FFT的空间卡了半天 后来发现根本不用开那么大... 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串 ...
- 2017.10.24队内互测——压轴出场的互测终曲|(*_-)
出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...
- winpcap基本原理及常见应用_碳十四测年的基本原理和常见应用谬误
如果说地层学原理是18世纪地质学给19世纪考古学的重要礼物,那么放射性碳定年法就是20世纪考古学最重要的进步之一.这两种方法都对年代判定做出了重要的贡献,因为若是没有某种类型的年代测定,我们就不可能建 ...
- 【bzoj 十连测】[noip2016十连测第三场]Problem C: 序列(静态主席树)
Problem C: [noip2016十连测第三场]序列 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 78 Solved: 32 [Submi ...
- 2017.9.16队内互测——老年组Day1
2017.9.16队内互测--老年组Day1 出题人:feather,MeiCo,Summer,Black Problem 1: 对于100%的数据,n<=1000 截图比较奇怪-还请见谅 简单 ...
- JAVA 判断简单密码算法_十道简单算法题二【Java实现】
前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...
最新文章
- javascript的Array对象
- Miniconda3及pip换源(conda清华源关闭)
- 程序员去创业公司做CTO,需要注意什么?
- Thinkphp3.23 关联模型relation方法不存在解决方法
- Apache http强制转为https页面访问(转)
- Oracle数据块损坏的恢复实例
- RabbitMq(十六)单机多实例集群搭建步骤介绍
- 细聊MySQL之常用工具及基本操作(完)
- ssh相互访问不用密码
- Eclipse的自动编译和手动编译
- Process p = new Process();
- html文件怎么用影音先锋打开,先锋影音怎么用
- h5移动端开发中配置真机测试
- 【Git】Git入门
- JAVA基础算法练习(5):行星碰撞
- 百度飞桨AI抠图+图片合成
- Unity 骨骼动画 Anima2D
- java操作excel_每天一个小技术之Java操作Excel
- spacedesk投影,将电脑屏幕投影或者扩展到手机
- 亿赛通的加密软件对加密图纸文件外发效果如何?