loj2977 巧克力 (斯坦纳树+随机化)
考虑颜色比较少的时候,第一问可以直接斯坦纳树
第二问考虑二分,每次把每格的权值给成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 巧克力 (斯坦纳树+随机化)的更多相关文章
- LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)
题目 题目 做法 考虑部分数据(颜色较少)的: 二分中位数\(mid\),将\(v[i]=1000+(v[i]>mid)\) 具体二分操作:然后求出包含\(K\)种颜色的联通快最小的权值和,判断 ...
- 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)
洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ...
- 【THUSC2017】【LOJ2977】巧克力 斯坦纳树
题目大意 有一个网格(或者你可以认为这是一个图),每个点都有颜色 \(c_i\) 和点权 \(a_i\). 求最小的连通块,满足这个连通块内点的颜色数量 \(\geq k\).在满足点数最少的前提下, ...
- [THUSC2017]巧克力[斯坦纳树、随机化]
题意 题目链接 分析 对于第一问,如果颜色数量比较少的话可以 \(\binom{cnt}{k}\) 枚举最终连通块中的 \(k\) 种颜色,然后利用斯坦纳树求解. 如果颜色比较多,考虑将所有的颜色重新 ...
- LOJ 2997 「THUSCH 2017」巧克力——思路+随机化+斯坦纳树
题目:https://loj.ac/problem/2977 想到斯坦纳树.但以为只能做 “包含一些点” 而不是 “包含一些颜色” .而且不太会处理中位数. 其实 “包含一些颜色” 用斯坦纳树做也和普 ...
- FJoi2017 1月20日模拟赛 直线斯坦纳树(暴力+最小生成树+骗分+人工构造+随机乱搞)
[题目描述] 给定二维平面上n个整点,求该图的一个直线斯坦纳树,使得树的边长度总和尽量小. 直线斯坦纳树:使所有给定的点连通的树,所有边必须平行于坐标轴,允许在给定点外增加额外的中间节点. 如下图所示 ...
- 【BZOJ2595】游览计划(状压DP,斯坦纳树)
题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以 ...
- HDU 4085 斯坦纳树
题目大意: 给定无向图,让前k个点都能到达后k个点(保护地)中的一个,而且前k个点每个需要占据后k个中的一个,相互不冲突 找到实现这个条件达到的选择边的最小总权值 这里很容易看出,最后选到的边不保证整 ...
- 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 ...
随机推荐
- ___Html页面使用Ajax做数据显示
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...
- springMVC报404,没有显示地址
正常报404会显示你的错误地址信息,而针对本问题 如果你使用的是springMVC框架,这就代表你的请求被拦截了
- IntelliJ IDEA如何激活?
本文使用的IDEA的版本是:14.0.3 下载IDEA授权服务器(下载地址见最后),并解压,打开解压后的IntelliJIDEALicenseServer目录,可以看到如下的两个文件: Intelli ...
- 命令模式 Command 行为型 设计模式(十八)
命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...
- JMeter接口测试实战-动态数据验证
JMeter接口测试实战-动态数据验证 说到验证就不得不说断言, 先来看下JMeter官方给出断言(Assertion)的定义, 用于检查测试中得到的响应数据等是否符合预期,用以保证测试过程中的数据交 ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- FFmpeg部署及相关指令操作说明
1.首先在http://ffmpeg.zeranoe.com/builds/上下载static版本, 下载好以后解压缩到 c:/ffmpeg/ 2.配置环境变量 path -> c:/ffmpe ...
- c/c++ 右值引用,forward关键字
c++ forward关键字 forward的由来:模板函数中的推导类型,作为另一函数的参数时,不管实参是什么类型,作为另一个参数的实参时,都变成了左值.因为C++里规定函数的形参就是左值,不过调用侧 ...
- 分布式系统CAP理论
在单机的数据库系统之中,我们很容易实现一套满足ACID 特性的 事务处理系统, 事务的一致性不存在问题. 但是在分布式系统之中,由于数据分布在不同的主机结点上,如何对着些数据进行分布式的事务处理就具有 ...
- kali权限提升之本地提权
kali权限提升之本地提权 系统账号之间权限隔离 操作系统的安全基础 用户空间 内核空间 系统账号: 用户账号登陆时候获取权限令牌 服务账号无需用户登录已在后台启动服务 windows用户全权限划分: ...