原题链接: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省队十连测] 好题相关推荐

  1. BZOJ5243 : [Lydsy2017省队十连测]绝版题

    要找的就是这棵树的带权重心,以带权重心为根时每棵子树的权值和不超过总权值和的一半. 因此按$\frac{v[i]}{\sum v[i]}$的概率随机选取一个点$x$,则重心有$\frac{1}{2}$ ...

  2. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树

    [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 93  Solved: 53 [Submit][Status ...

  3. BZOJ5217: [Lydsy2017省队十连测]航海舰队

    被FFT的空间卡了半天 后来发现根本不用开那么大- 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串匹配 ...

  4. [Lydsy2017省队十连测]航海舰队

    SOL: 我们用FFT匹配字符串. 不知道为什么我的NTT挂了,贴一个别人的FFT. #include<bits/stdc++.h> #define ll long long #defin ...

  5. BZOJ5217: [Lydsy2017省队十连测]航海舰队 FFT

    被FFT的空间卡了半天 后来发现根本不用开那么大... 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串 ...

  6. 2017.10.24队内互测——压轴出场的互测终曲|(*_-)

    出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...

  7. winpcap基本原理及常见应用_碳十四测年的基本原理和常见应用谬误

    如果说地层学原理是18世纪地质学给19世纪考古学的重要礼物,那么放射性碳定年法就是20世纪考古学最重要的进步之一.这两种方法都对年代判定做出了重要的贡献,因为若是没有某种类型的年代测定,我们就不可能建 ...

  8. 【bzoj 十连测】[noip2016十连测第三场]Problem C: 序列(静态主席树)

    Problem C: [noip2016十连测第三场]序列 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 78  Solved: 32 [Submi ...

  9. 2017.9.16队内互测——老年组Day1

    2017.9.16队内互测--老年组Day1 出题人:feather,MeiCo,Summer,Black Problem 1: 对于100%的数据,n<=1000 截图比较奇怪-还请见谅 简单 ...

  10. JAVA 判断简单密码算法_十道简单算法题二【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

最新文章

  1. javascript的Array对象
  2. Miniconda3及pip换源(conda清华源关闭)
  3. 程序员去创业公司做CTO,需要注意什么?
  4. Thinkphp3.23 关联模型relation方法不存在解决方法
  5. Apache http强制转为https页面访问(转)
  6. Oracle数据块损坏的恢复实例
  7. RabbitMq(十六)单机多实例集群搭建步骤介绍
  8. 细聊MySQL之常用工具及基本操作(完)
  9. ssh相互访问不用密码
  10. Eclipse的自动编译和手动编译
  11. Process p = new Process();
  12. html文件怎么用影音先锋打开,先锋影音怎么用
  13. h5移动端开发中配置真机测试
  14. 【Git】Git入门
  15. JAVA基础算法练习(5):行星碰撞
  16. 百度飞桨AI抠图+图片合成
  17. Unity 骨骼动画 Anima2D
  18. java操作excel_每天一个小技术之Java操作Excel
  19. spacedesk投影,将电脑屏幕投影或者扩展到手机
  20. 亿赛通的加密软件对加密图纸文件外发效果如何?

热门文章

  1. 阿里云oss Referer设置
  2. python在工程管理专业的应用_工程大数据在水利工程建设管理的应用
  3. 简单的docker下载安装jenkins
  4. 手机的移动网络怎么开_都连接WiFi了,还要开移动网络吗?
  5. Redis缓存相关问题总结
  6. Javascript的块级作用域
  7. vue-methods三种调用的形势
  8. SVN配置–服务器端(linux)
  9. linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
  10. 这几天可能是长时间关注电脑,眼睛没有得到休息,所以就早上起来眼睛有点通...