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 ...
随机推荐
- oracle非正常退出后重启实例
sqlplus /nolog 回车 conn / as sysdba 回车 startup 回车(如果被告知已启动,应先执行 shutdown immediate 回车)
- css3修改浏览器scroll默认样式
最近公司的新项目.前端样式采用的蚂蚁金服的antDesign. 比较喜欢antDesign.BootStrap一类简约大方的前端样式库. 但是在页面布局上.包括一些选择框.默认的scroll样式简直丑 ...
- .Net Core 学习笔记1——包、元包、框架
.Net Core 是由NuGet包(package)组成的平台. 一起使用的多个包的集合:元包(Metapackage) package 包 (对应以前的程序集概念) Framework 框架 as ...
- Linux学习历程——Centos 7 ls命令
一.命令介绍 ls命令用于显示目录中的信息. ----------------------------------------------------------------------------- ...
- Windows Server 2016-Telnet 简介及安装
Telnet是基于请求注释(RFC)854的因特网标准程序和协议,该RFC规定了一种在网络上发送和接收未加密的ASCII字符(明文)的方法.Telnet包含两个功能模块:Telnet客户端和Telne ...
- cmd黑客入侵命令大全
nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写 tracert -参数 ip(或计算机名) 跟踪路由(数据包 ...
- python学习_2
1.pycharm部分技巧 1)创建时路径尽量要避免中文2)用滚轮调整编辑器字体大小 1.file->setting...->editor->general 搜索'mouse' ...
- 添加python虚拟环境
在我centos上装有两个python版本 # 我在~/py3/目录下创建虚拟环境,该目录为python3的一个独立环境 [root@localhost /]# cd home [root@local ...
- 【转】分享JavaScript监听全部Ajax请求事件的方法
若Ajax请求是由jQuery的$.ajax发起的,默认情况下可以使用 jQuery的Global Ajax Event Handlers监听到Ajax事件,然而我遇到的却是用原生JavaScript ...
- Luogu1574 超级数
Luogu1574 超级数 \(n\) 次询问不超过 \(a_i\) 的最大反素数 \(n\leq10^5,\ a_i\leq10^{17}\) 数论 似乎重题 bzoj1053 [HAOI2007] ...