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

对于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. .Net Core微服务入门全纪录(七)——IdentityServer4-授权认证

    前言 上一篇[.Net Core微服务入门全纪录(六)--EventBus-事件总线]中使用CAP完成了一个简单的Eventbus,实现了服务之间的解耦和异步调用,并且做到数据的最终一致性.这一篇将使 ...

  2. C++输出三角图形

    输出像这样的三角图形 3            1           1 1          1    1         1 1 1 1        1          1       1 ...

  3. java动态代理基本原理及proxy源码分析一

    本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...

  4. Alink漫谈(十) :线性回归实现 之 数据预处理

    Alink漫谈(十) :线性回归实现 之 数据预处理 目录 Alink漫谈(十) :线性回归实现 之 数据预处理 0x00 摘要 0x01 概念 1.1 线性回归 1.2 优化模型 1.3 损失函数& ...

  5. MYSQL 之 JDBC(七):增删改查(五) DAO设计模式

    Data Access Object,数据访问对象 what:访问数据信息的类.包含了对数据的CRUD(create.read.update.delete,增删改查)操作,而不包含任何业务相关的信息. ...

  6. 阻止 iPhone 视频自动全屏

    最近一年都在做直播,遭video 全屏的问题困扰了很久.下面将阻止 ios视频自动全屏的办法写出来.添加 playsinline 和 webkit-playsinline="true&quo ...

  7. bzoj1661[Usaco2006 Nov]Big Square 巨大正方形*

    bzoj1661[Usaco2006 Nov]Big Square 巨大正方形 题意: n*n的图中有一些J点,一些B点和一些空白点,问在空白点添加一个J点所能得到的有4个J点组成最大正方形面积.n≤ ...

  8. bzoj3196Tyvj1730二逼平衡树

    bzoj3196Tyvj1730二逼平衡树 题意: 维护一个数列,操作:查询k在区间内的排名.查询区间内排名为k的值3.修改某一位上的数值.查询k在区间内的前驱(前驱定义为小于x,且最大的数).查询k ...

  9. 【翻译】.NET 5中的性能改进

    [翻译].NET 5中的性能改进 在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进. 从.NET Core 2.0到.NET Core 2.1到.NET Core ...

  10. 没内鬼,来点干货!volatile和synchronized

    题外话 这篇笔记是我<没内鬼>系列第二篇,其实我计划是把设计模式和多线程并发分为两个系列,统一叫<一起学系列>来系统的介绍 相关的知识,但是想到这篇笔记去年就写成了,一直不发心 ...