考虑颜色比较少的时候,第一问可以直接斯坦纳树

第二问考虑二分,每次把每格的权值给成1000+[a[i]>m],就是在个数最少的基础上尽量选小于等于m的

然而颜色太多不能直接做,但可以把每种颜色映射到5以内,这样的话,做一次的正确率就是作为答案的那5种颜色分别被映射到了1~5的概率,就是$\frac{5!}{5^5}=0.0384$,做233次正确率就有$99.989\%$了

 #include<bits/stdc++.h>
#include<tr1/unordered_map>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> pa;
const int maxn=,maxp=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int step[][]={{,},{,-},{,},{-,}};
int id[maxn][maxn],pct,pos[maxn][];
int N,M,S,K;
int f[maxn][maxp],c[maxn],a[maxn],val[maxn];
int hsh[maxn],C; queue<int> q;
bool flag[maxn];
inline void spfa(int s){
for(int i=;i<=pct;i++) if(c[i]!=-) flag[i]=,q.push(i); while(!q.empty()){
int p=q.front();q.pop();
flag[p]=;
int x=pos[p][],y=pos[p][];
for(int j=;j<;j++){
int nx=x+step[j][],ny=y+step[j][];
if(nx<||ny<||nx>N||ny>M||c[id[nx][ny]]==-) continue;
int ni=id[nx][ny];
if(f[ni][s]>f[p][s]+val[ni]){
f[ni][s]=f[p][s]+val[ni];
if(!flag[ni]) q.push(ni),flag[ni]=;
}
}
}
} inline int solve(){
CLR(f,);
for(int i=;i<=pct;i++) if(c[i]!=-) f[i][<<hsh[c[i]]]=val[i];
for(int s=;s<(<<K);s++){
for(int i=;i<=pct;i++){
if(c[i]==-) continue;
for(int ss=(s-)&s;ss;ss=(ss-)&s){
f[i][s]=min(f[i][s],f[i][ss]+f[i][s^ss]-val[i]);
}
}
spfa(s);
}
int ans=1e9;
for(int i=;i<=pct;i++) ans=min(ans,f[i][(<<K)-]);
return ans;
} int main(){
//freopen("","r",stdin);
srand();
for(int T=rd();T;T--){
pct=,C=;
N=rd(),M=rd(),K=rd();
for(int i=;i<=N;i++){
for(int j=;j<=M;j++) id[i][j]=++pct,pos[pct][]=i,pos[pct][]=j;
}
for(int i=;i<=N;i++) for(int j=;j<=M;j++) c[id[i][j]]=rd(),C=max(C,c[id[i][j]]);
for(int i=;i<=N;i++) for(int j=;j<=M;j++) a[id[i][j]]=rd();
int ans1=1e9,ans2=1e9;
for(int t=;t<=;t++){
for(int i=;i<=C;i++) hsh[i]=rand()%K;
int l=,r=1e6,a1=1e9,a2=1e9;
while(l<=r){
int m=(l+r)>>;
for(int i=;i<=pct;i++) val[i]=(c[i]==-?1e8:+(a[i]>m));
int re=solve();
if(re>=1e8) break;
a1=re/;
int x=a1-(re-a1*);
if(x>=(a1+)/) a2=m,r=m-;
else l=m+;
}
if(a1<ans1||(ans1==a1&&a2<=ans2)) ans1=a1,ans2=a2;
} printf("%d %d\n",ans1==1e9?-:ans1,ans1==1e9?-:ans2);
}
return ;
}

loj2977 巧克力 (斯坦纳树+随机化)的更多相关文章

  1. LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)

    题目 题目 做法 考虑部分数据(颜色较少)的: 二分中位数\(mid\),将\(v[i]=1000+(v[i]>mid)\) 具体二分操作:然后求出包含\(K\)种颜色的联通快最小的权值和,判断 ...

  2. 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)

    洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ...

  3. 【THUSC2017】【LOJ2977】巧克力 斯坦纳树

    题目大意 有一个网格(或者你可以认为这是一个图),每个点都有颜色 \(c_i\) 和点权 \(a_i\). 求最小的连通块,满足这个连通块内点的颜色数量 \(\geq k\).在满足点数最少的前提下, ...

  4. [THUSC2017]巧克力[斯坦纳树、随机化]

    题意 题目链接 分析 对于第一问,如果颜色数量比较少的话可以 \(\binom{cnt}{k}\) 枚举最终连通块中的 \(k\) 种颜色,然后利用斯坦纳树求解. 如果颜色比较多,考虑将所有的颜色重新 ...

  5. LOJ 2997 「THUSCH 2017」巧克力——思路+随机化+斯坦纳树

    题目:https://loj.ac/problem/2977 想到斯坦纳树.但以为只能做 “包含一些点” 而不是 “包含一些颜色” .而且不太会处理中位数. 其实 “包含一些颜色” 用斯坦纳树做也和普 ...

  6. FJoi2017 1月20日模拟赛 直线斯坦纳树(暴力+最小生成树+骗分+人工构造+随机乱搞)

    [题目描述] 给定二维平面上n个整点,求该图的一个直线斯坦纳树,使得树的边长度总和尽量小. 直线斯坦纳树:使所有给定的点连通的树,所有边必须平行于坐标轴,允许在给定点外增加额外的中间节点. 如下图所示 ...

  7. 【BZOJ2595】游览计划(状压DP,斯坦纳树)

    题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以 ...

  8. HDU 4085 斯坦纳树

    题目大意: 给定无向图,让前k个点都能到达后k个点(保护地)中的一个,而且前k个点每个需要占据后k个中的一个,相互不冲突 找到实现这个条件达到的选择边的最小总权值 这里很容易看出,最后选到的边不保证整 ...

  9. hdu4085 Peach Blossom Spring 斯坦纳树,状态dp

    (1)集合中元素表示(1<<i), i从0开始 (2)注意dp[i][ss] = min(dp[i][ss], dp[i][rr | s[i]] + dp[i][(ss ^ rr) | s ...

随机推荐

  1. SQL—访问操作(2)

    上一篇介绍了数据访问操作的两种方法,接下来把剩下两个操作简单介绍一下: ExecuteNonQuery()的操作:对数据库进行增加.修改.删除 返回类型是 int  代表受影响的行数 返回的结果如果是 ...

  2. 编程心法 之 Scrum - Agile 敏捷开发

    Scrum是一种敏捷开发的方法 先定一个能达到的小目标 Scrum 团队 包括产品负责人.开发团队和Scrum Master Product Owner 产品负责人:管理代办事项和优先级的唯一负责人. ...

  3. 升级WIN10 (9879)后IE无响应的解决办法

    身为程序猿,当然有了新系统就要尝尝鲜,有WIN8时,哥是朋友圈第一个用的,有WIN8.1时哥也是第一个升级的. 现在WIN10来了,当然也得赶紧尝尝鲜.直接下载了 9879版的预览版本安装. 要说WI ...

  4. Snapde电子表格编写Exprtk脚本进行数据运算

    Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它运行的速度非常快,反应非常灵敏. 一.打开文件:用Snapde打开需要运算的CSV文件 二.添加行列:在编辑菜单找到设置 ...

  5. Android 使用TextView实现跑马灯效果

    前言 我们在开发中经常会遇到一个小问题.比如下面一个小例子: 这个文字太长,单行中导致无法全部显示出来,这就是今天要实现的功能. 当然,百度中也有很多这种解决方案. 其中有一种,例如: <Tex ...

  6. First Show

    随便写写,记录美好生活 博客的内容主要是关于java后台开发所涉及到技术栈的学习记录

  7. cvc-elt.1: Cannot find the declaration of element 'beans'Failed to read schema document 'http://www.springframework.org/schema/beans/spring- beans-3.0.xsd'

    Multiple annotations found at this line: - cvc-elt.1: Cannot find the declaration of element 'beans' ...

  8. [20190419]shared latch spin count 2.txt

    [20190419]shared latch spin count 2.txt --//上午测试shared latch XX模式的情况,链接:http://blog.itpub.net/267265 ...

  9. shell脚本-正则、grep、sed、awk

    ----------------------------------------正则---------------------------------------- 基础正则 ^word ##搜索以w ...

  10. c++字节对齐编译器指令#pragma

    第一种 #pragma pack(push, 1) // 先把当前对齐设置压栈,再设置为1字节对齐 struct S { char a; ]; }; #pragma pack(pop) // 恢复先前 ...