算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目。。

对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp.

观察最后答案是一个连通块 从而可以发现这个连通块必然存在一个深度最浅的点且唯一 所以随便找一个点做根然后对自己子树内寻找答案就可以是正确的。

考虑另外的30%的数据k<=3 可是颜色数最多可以有n个 不知道哪个是最终答案。

一次状压dp的复杂度:\(2^{2k}\cdot n\)

容易得到可以暴力枚举一下 然后要做 \(C(n,3)\) 这样会TLE。

此时可以考虑一种随机化:每次随机三个颜色是谁 这样一直跑...

显然这个和上面那个差不多 也是一个低效率的随机 这里要用到一个非常好用的思路 曾经在[GXOI/GZOI2019]旅行者 这道题中有类似的体现。

后者是 发现每次跑最短路可以跑多源对多源的且一些不优的点对对答案无影响 才可以进一步的使用不断的分组来得到答案。

而这个 可以考虑另外一种比较高效的随机 不需要每次都求出到底是哪几个点是答案 而我们只需要让其在答案中得到体现。

做法是 由于只有k个位置 给每个颜色rand一个位置然后直接求 这样做可以发现如果不是最优解 那么显然答案会更小 对答案没影响。

观察一下这样随机的效率\(\frac{k!}{k^k}\) 每做一次是0.03的概率 那么做多次概率就>1了 在期望的角度是很容易得到正确答案的。

这里我加了卡时 强制跑0.8s再退出 这样正确性会更高.

code
//#include<bits/stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
#include<string>
#include<utility>
#include<queue>
#include<vector>
#include<algorithm>
#include<deque>
#include<stack>
#include<list>
#include<bitset>
#include<set>
#include<map>
#define INF 1000000000000000000ll
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define vep(p,n,i) for(int i=p;i<n;++i)
#define db double
#define get(x) x=read()
#define put(x) printf("%d\n",x)
#define pb push_back
#define ll long long
#define db double
#define putl(x) printf("%lld\n",x)
using namespace std;
char *fs,*ft,buf[1<<15];
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
int x=0,f=1;char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=10010,N=5;
int n,k,len,ans,maxx;
int a[MAXN],b[MAXN],c[MAXN],fa[MAXN];
int f[MAXN][1<<N];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1];
inline void add(int x,int y)
{
ver[++len]=y;nex[len]=lin[x];lin[x]=len;
ver[++len]=x;nex[len]=lin[y];lin[y]=len;
}
inline void dp(int x,int v)
{
fa[x]=v;
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(tn==v)continue;
dp(tn,x);
}
}
inline void dfs(int x)
{
f[x][1<<c[x]-1]=1;
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(tn!=fa[x])
{
dfs(tn);
fep(maxx,1,w1)fep(maxx,1,w2)f[x][w1|w2]=min(f[x][w1|w2],f[x][w1]+f[tn][w2]);
}
}
ans=min(ans,f[x][maxx]);
}
int main()
{
freopen("hao.in","r",stdin);
freopen("hao.out","w",stdout);
double st=clock();
get(n);get(k);int mx=0;
rep(1,n,i)get(a[i]),mx=max(mx,a[i]);
rep(2,n,i)add(read(),read());
dp(1,0);maxx=1<<k;--maxx;
srand(time(0));ans=n;
double ed=clock();
while(ed-st<=880)
{
memset(f,0x3f,sizeof(f));
rep(1,mx,j)b[j]=rand()%k+1;
rep(1,n,j)c[j]=b[a[j]];
dfs(1);
ed=clock();
}
put(ans);return 0;
}

6.28 NOI模拟赛 好题 状压dp 随机化的更多相关文章

  1. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

  2. 2018.10.05 NOIP模拟 上升序列(状压dp)

    传送门 状压dp好题. 首先需要回忆O(nlogn)O(nlog n)O(nlogn)求lislislis的方法,我们会维护一个单调递增的ddd数组. 可以设计状态f(s1,s2)f(s1,s2)f( ...

  3. 2018.10.01 NOIP模拟 偷书(状压dp)

    传送门 状压dp经典题. 令f[i][j]f[i][j]f[i][j]表示到第i个,第i−k+1i-k+1i−k+1~iii个物品的状态是j时的最大总和. 然后简单维护一下转移就行了. 由于想皮一下果 ...

  4. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

  5. [欢乐赛]班服 状压DP

    班服 (shirt.pas/.c/.cpp) 时间限制:1s:内存限制 128MB 题目描述: 要开运动会了,神犇学校的n个班级要选班服,班服共有100种样式,编号1~100.现在每个班都挑出了一些样 ...

  6. 【思维题 状压dp】APC001F - XOR Tree

    可能算是道中规中矩的套路题吧…… Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...

  7. P3694 邦邦的大合唱站队/签到题(状压dp)

    P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...

  8. [CSP-S模拟测试]:装饰(状压DP)

    题目传送门(内部题114) 输入格式 第一行一个正整数$n$. 接下来一行$n-1$个正整数,第$i$个数为$f_{i+1}$. 接下来一行$n$个数,若第$i$个数为$0$则表示林先森希望$i$号点 ...

  9. 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)

    传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...

随机推荐

  1. html5中contenteditable 光标_如何设置光标位置

    在js中,光标是一个对象,当你选中某个元素的时候才会出现光标对象.比如:我们点击一个输入框,实际会产生一个选中对象-selection,这个对象我们可以通过indow.getSelection()来获 ...

  2. nodejs 获取当前路径的方法

    var path = require("path"); var url = path.resolve('./');

  3. ICPC 2018 亚洲横滨赛 C Emergency Evacuation(暴力,贪心)

    ICPC 2018 亚洲横滨赛 C Emergency Evacuation 题目大意 你一个车厢和一些人,这些人都坐在座位上,求这些人全部出去的时间最小值 Solution 题目咋说就咋做 直接模拟 ...

  4. 5 个 IDEA 必备插件,让效率成为习惯

    IDEA 是最好的 IDE,谁赞成,谁反对? IDEA 是 Java 开发人员中最受欢迎和用户友好的 IDE 之一,它具有许多便利的功能,例如智能代码完成,自动执行繁琐的重复开发任务,因此它已成为 J ...

  5. web CSS3 实现3D动态翻牌效果

    使用纯CSS3 实现翻牌效果  需要注意要给子盒子使用绝对定位,这样两个盒子可以完全重合在一起,需要给父盒子一个 transform-style: preserve-3d;让子盒子翻转时保持3D效果, ...

  6. C#根据反射动态创建ShowDoc接口文本信息

    我目前每天主要工作以开发api为主,这都离不开接口文档.如果远程对接的话前端总说Swagger不清晰,只能重新找一下新的接口文档.ShowDoc就是一个不错的选择,简洁.大方.灵活部署. 但是话说回来 ...

  7. MySQL 面试题 24 问

    MySQL 是数据库中的主流中的主流,小中性公司基本都以它为主,而作为后端开发和数据库工程师来说,MySQL 是面试必须要过的一关.以下是小编整理网络的 MySQL 面试高频题,希望对大家有所帮助. ...

  8. elementui 使用Form表单 的 resetForm表单功能出现的问题

    代码因为在保密机上,这里只进行描述并截取elemen文档中的代码作为参考 今天在开发一个很简单需求的时候遇到的问题,在使用elementui的表单功能,将增和改的表单进行了复用,是在表单的父组件 dr ...

  9. 在Access中执行SQL

    1.基本介绍 Microsoft Access在很多地方得到广泛使用,例如小型企业,大公司的部门.喜爱编程的开发人员亦利用它来制作处理数据的桌面系统.它也常被用来开发简单的WEB应用程序. 2.Ace ...

  10. Ethical Hacking - Web Penetration Testing(1)

    How to hack a website? An application installed on a computer. ->web application pen-testing A co ...