LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)
题目
做法
- 考虑部分数据(颜色较少)的:
二分中位数\(mid\),将\(v[i]=1000+(v[i]>mid)\)
具体二分操作:然后求出包含\(K\)种颜色的联通快最小的权值和,判断该权值和是否满足中位数为\(mid\),从而调整范围
其中求权值和显然可以用斯坦纳树解决
- 正解:
我们每次随机把颜色映射到\([0,K)\)中去,每次得到的结果正确率就为答案联通块的离散颜色正好一一对应的概率:\(\frac{K!}{K^K}\)
随机\(233\)次,有\(99\%\)以上的正确率
Code
#include<bits/stdc++.h>
#include<queue>
typedef int LL;
const LL dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
const LL maxn=7e4+9,inf=1e8;
inline LL Read(){
LL x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+c-'0',c=getchar();
}
return x*f;
}
std::queue<LL> que;
LL n,m,T,K,C,tot;
LL f[maxn][109],c[maxn],sta[maxn],d[maxn][2],a[maxn],pos[255][255],v[maxn],hs[maxn];
inline bool Ok(LL x,LL y){
return x>=1 && x<=n && y>=1 && y<=m;
}
inline void Spfa(LL bit){
for(LL i=1;i<=tot;++i) if(c[i]!=-1) que.push(i);
while(que.size()){
LL now(que.front()); que.pop();
LL x(d[now][0]),y(d[now][1]);
for(LL i=1;i<=4;++i){
LL xx(x+dx[i]),yy(y+dy[i]),to(pos[xx][yy]);
if(!Ok(xx,yy) || c[to]==-1) continue;
if(f[to][bit]>f[now][bit]+a[to]){
f[to][bit]=f[now][bit]+a[to];
que.push(to);
}
}
}
}
inline LL Solve(LL up){
for(LL i=0;i<up;++i)
for(LL j=1;j<=tot;++j)
f[j][i]=inf;
for(LL i=1;i<=tot;++i) if(c[sta[i]]!=-1) f[i][1<<hs[c[i]]]=a[i];
for(LL bit=1;bit<up;++bit){
for(LL i=1;i<=tot;++i){
LL x(i);
if(c[x]==-1) continue;
for(LL bit1=(bit-1)&bit;bit1;bit1=(bit1-1)&bit)
f[x][bit]=std::min(f[x][bit],f[x][bit1]+f[x][bit-bit1]-a[x]);
}
Spfa(bit);
}
LL ans(inf);
for(LL i=1;i<=tot;++i) ans=std::min(ans,f[i][up-1]);
return ans;
}
int main(){
srand(time(NULL));
T=Read();
while(T--){
n=Read(); m=Read(); K=Read(); tot=0;
sta[0]=0;
C=0;
for(LL i=1;i<=n;++i)
for(LL j=1;j<=m;++j){
pos[i][j]=++tot;
d[tot][0]=i; d[tot][1]=j;
}
for(LL i=1,now=0;i<=n;++i)
for(LL j=1;j<=m;++j){
LL col(Read());
c[++now]=col;//col
C=std::max(C,col);
}
for(LL i=1,now=0;i<=n;++i)
for(LL j=1;j<=m;++j)
v[++now]=Read();//val
LL up(1<<K),ans1(inf),ans2(inf);
for(LL i=1;i<=233;++i){
for(LL j=1;j<=C;++j) hs[j]=rand()%K;
LL l(0),r(1000000),a1(inf),a2(inf);
while(l<=r){
LL mid(l+r>>1);
for(LL i=1;i<=tot;++i) a[i]=(c[i]==-1?inf:1000+(v[i]>mid));
LL now(Solve(up));
if(now==inf) break;
a1=now/1000;
LL small(a1-(now-a1*1000));
if(small>=(a1+1>>1)){
a2=mid; r=mid-1;
}else l=mid+1;
}
if(a1<ans1 || (a1==ans1 && a2<ans2)){
ans1=a1; ans2=a2;
}
}
if(ans1==-1) puts("-1 -1");
else printf("%d %d\n",ans1,ans2);
}
return 0;
}
LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)的更多相关文章
- @loj - 2977@ 「THUSCH 2017」巧克力
目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...
- LOJ 2997 「THUSCH 2017」巧克力——思路+随机化+斯坦纳树
题目:https://loj.ac/problem/2977 想到斯坦纳树.但以为只能做 “包含一些点” 而不是 “包含一些颜色” .而且不太会处理中位数. 其实 “包含一些颜色” 用斯坦纳树做也和普 ...
- LOJ 2980 「THUSCH 2017」大魔法师——线段树
题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...
- loj2977 巧克力 (斯坦纳树+随机化)
考虑颜色比较少的时候,第一问可以直接斯坦纳树 第二问考虑二分,每次把每格的权值给成1000+[a[i]>m],就是在个数最少的基础上尽量选小于等于m的 然而颜色太多不能直接做,但可以把每种颜色映 ...
- LOJ #2978「THUSCH 2017」杜老师
听说LOJ传了THUSC题赶紧上去看一波 随便点了一题都不会做想了好久才会写暴力爆了一发过了... LOJ #2978 题意 $ T$次询问,每次询问$ L,R$,问有多少种选取区间中数的方案使得选出 ...
- LOJ 2979 「THUSCH 2017」换桌——多路增广费用流
题目:https://loj.ac/problem/2979 原来的思路: 优化连边.一看就是同一个桌子相邻座位之间连边.相邻桌子对应座位之间连边. 每个座位向它所属的桌子连边.然后每个人建一个点,向 ...
- LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论
题目:https://loj.ac/problem/2978 题解:https://www.cnblogs.com/Paul-Guderian/p/10248782.html 第 i 个数的 bits ...
- loj#2978. 「THUSCH 2017」杜老师(乱搞)
题面 传送门 题解 感谢yx巨巨 如果一个数是完全平方数,那么它的所有质因子个数都是偶数 我们把每一个数分别维护它的每一个质因子的奇偶性,那么就是要我们选出若干个数使得所有质因子的个数为偶数.如果用线 ...
- 「THUSCH 2017」大魔法师 解题报告
「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...
随机推荐
- ABP 基于DDD的.NET开发框架 学习(二)创建实体
1.创建模型类打开.Core项目,新建新建一个项目文件夹(Demo);为了演示表关联及外键的使用,创建两个类:创建类ClothesCategoty.csusing Abp.Domain.Entitie ...
- linux的scp命令可以在linux服务器之间复制文件和目录
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- url格式化函数http_build_query() 和parse_str() 函数
例子 1. http_build_query() 使用示例 <?php $data = array('foo'=>'bar', 'baz'=>'boom', 'cow'=>'m ...
- .Dot NET Cored简介
一.诞生原因 1..Net平台封闭. 2.不支持跨平台. 3.受限于Windows平台性能,无法解决高性能场景. 二.优势 1.支持跨平台.开源.系统建设成本低. 2.效率和性能较好. 三.缺点 1. ...
- ORA-28547: connection to server failed, probable Oracle Net admin error
现象 C:\Users\Administrator>sqlplus scott/tiger@192.168.1.11:1521/orcl SQL*Plus: Release 11.2.0.4.0 ...
- Python面向对象之进阶
一.property 内置函数 装饰器的使用:所有的装饰器函数.方法.类的上一行直接@装饰器的名字 装饰器的分类: ① 装饰函数 ② 装饰方法 ③ 装饰类 property 是一个装饰器函数 @pro ...
- LInux CentOS7 vsftpd 配置注释
本文首发: https://www.somata.work/2019/LinuxCentOSvsftpdConfigComment.html vsftpd.conf anonymous_enable= ...
- tomcat部署(一)
Tomcat部署最佳实践 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 tomcat是玩web软件必会技能之一,今天我给大家介绍一下tomc ...
- Java枚举的小例子
有一次工作中,要根据多个参数确定一个值(车辆事件),确定一个值需要的参数大部分的属性名称是相同的,少部分是独有的,但是参数的值几乎都是不同的: 因为参数太多,if-else写起来就太不优雅了,可以参考 ...
- apache/tomcat笔记
apache是什么? apache http server 简称apache是世界上排名前列的web服务器,因开源,简单,高性能,速度快,还可以做代理服务器,所以广受人们欢迎 httpd:httpd是 ...