Problem Statement

There are $N$ cards numbered $1$ through $N$.
Each face of a card has an integer written on it; card $i$ has $A_i$ on its front and $B_i$ on its back.
Initially, all cards are face up.

There are $M$ machines numbered $1$ through $M$.
Machine $j$ has two (not necessarily distinct) integers $X_j$ and $Y_j$ between $1$ and $N$. If you power up machine $j$,
it flips card $X_j$ with the probability of $\frac{1}{2}$, and flips card $Y_j$ with the remaining probability of $\frac{1}{2}$.
This probability is independent for each power-up.

Snuke will perform the following procedure.

  1. Choose a set $S$ consisting of integers from $1$ through $M$.
  2. For each element in $S$ in ascending order, power up the machine with that number.

Among Snuke's possible choices of $S$, find the maximum expected value of the sum of the integers written on the face-up sides of the cards after the procedure.

Constraints

  • $1\leq N \leq 40$
  • $1\leq M \leq 10^5$
  • $1\leq A_i,B_i \leq 10^4$
  • $1\leq X_j,Y_j \leq N$
  • All input values are integers.

\(N\le 40\),结合题目,复杂度应该是 \(2^{\frac n2}\) 相关的。

考虑如何求出期望。如果某一个数可能被选的话,那么他的期望就是 \(\frac {A_i+B_i}2\),否则是 \(A_i\)

看样例发现要特判 \(X_i=Y_i\),如果 \(A_{X_i}<B_{X_i}\),那么交换 \(A_{X_i}\) 和 \(B_{X_i}\)

如果 \(A_i<B_i\),那么他被选后期望会减少,否则期望会增多。设有 \(c\) 个 \(i\) 会变少。

如果 \(X_i\) 和 \(Y_i\) 翻转后期望都会变少,肯定不翻。期望都会变多,肯定,肯定翻。现在就是要看 \(X_i\) 和 \(Y_i\) 期望一个会变多,一个会变少的要不要翻。

肯定要对 \(c\) 大小分治。如果 \(c\le 20\),那么选了集合 \(s\) 中的所有会减少数,肯定会选所有可以选的会变多的数,直接枚举 \(s\) 统计即可。

如果 \(c\ge 20\),那么期望会增多的 \(i\) 不超过 20 个,用一个 dp 求出要得到集合 \(s\) 至少选多少减少的。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int M=45,N=1e5+5,S=1e7+5;;
int n,m,a[M],b[M],x[N],y[N],c,d,p[M],q[M],v[M][M];
LL to[S],s,f[M],ans;
LL calc(LL x,LL s)
{
int ret=0;
for(int i=0;i<d;i++)
{
if(x>>i&1)
ret+=a[q[i]]+b[q[i]];
else
ret+=2*a[q[i]];
}
for(int i=0;i<c;i++)
{
if(s>>i&1)
ret+=a[p[i]]+b[p[i]];
else
ret+=2*a[p[i]];
}
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d%d",a+i,b+i);
for(int i=0;i<m;i++)
{
scanf("%d%d",x+i,y+i);
--x[i],--y[i];
if(x[i]==y[i])
{
if(a[x[i]]<b[x[i]])
swap(a[x[i]],b[x[i]]);
--i,--m;
}
else
v[x[i]][y[i]]=v[y[i]][x[i]]=1;
}
for(int i=0;i<n;i++)
a[i]<b[i]? p[c++]=i:q[d++]=i;
LL s=0;
for(int i=0;i<c;i++)
for(int j=i+1;j<c;j++)
if(v[p[i]][p[j]])
s|=1LL<<j|1LL<<i;
for(int i=0;i<d;i++)
{
f[i]=s;
for(int j=0;j<c;j++)
if(v[q[i]][p[j]])
f[i]|=1LL<<j;
}
if(d<=c)
{
for(int i=0;i<d;i++)
to[1<<i]=f[i];
ans=calc(0,s);
for(int i=1;i<(1<<d);i++)
{
to[i]=to[i^(i&-i)]|to[i&-i];
ans=max(ans,calc(i,to[i]));
}
}
else
{
memset(to,-0x7f,sizeof(to));
for(int i=0;i<(1<<c);i++)
if((i|s)==s)
to[i]=0;
ans=calc(0,s);
for(int i=1;i<(1<<c);i++)
{
if(!to[i])
continue;
for(int j=0;j<d;j++)
to[i]=max(to[i],to[i^(i&f[j])]+b[q[j]]-a[q[j]]);
ans=max(ans,calc(0,i)+to[i]);
}
}
printf("%.6lf",ans/2.000);
return 0;
}

[ABC313F] Flip Machines的更多相关文章

  1. Teaching Machines to Understand Us 让机器理解我们 之三 自然语言学习及深度学习的信仰

    Language learning 自然语言学习 Facebook’s New York office is a three-minute stroll up Broadway from LeCun’ ...

  2. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  3. [LeetCode] Flip Game 翻转游戏之二

    You are playing the following Flip Game with your friend: Given a string that contains only these tw ...

  4. [LeetCode] Flip Game 翻转游戏

    You are playing the following Flip Game with your friend: Given a string that contains only these tw ...

  5. poj Flip Game 1753 (枚举)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27005   Accepted: 11694 Descr ...

  6. ARM概论(Advanced RISC Machines)

    简介 ARM7是32 位通用微处理器ARM(Advanced RISC Machines)家族中的一员,具有比较低的电源消耗和良好的性价比, 基于(精简指令)RISC结构,指令集和相关的译码机制与微程 ...

  7. POJ1753 Flip Game(bfs、枚举)

    链接:http://poj.org/problem?id=1753 Flip Game Description Flip game is played on a rectangular 4x4 fie ...

  8. Deep Learning 18:DBM的学习及练习_读论文“Deep Boltzmann Machines”的笔记

    前言 论文“Deep Boltzmann Machines”是Geoffrey Hinton和他的大牛学生Ruslan Salakhutdinov在论文“Reducing the Dimensiona ...

  9. poj1753 Flip Game

    题意:4*4的正方形,每个格子有黑白两面,翻转格子使得4*4个格子显示全黑或全白,翻转要求:选中的那个格子,以及其上下左右相邻的格子(如果存在)要同时翻转.输出最小的达到要求的翻转次数或者Imposs ...

  10. java.nio.ByteBuffer中flip,rewind,clear方法的区别

    对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...

随机推荐

  1. 快手商品详情API接口如何使用

    使用快手开的API接口获取商品详情,可按照以下步骤进行: 1.注册账号并创建应用 注册开发者账号,并在账号后台中创建一个应用,获得AppKey和AppSecret等信息.这些信息是使用API接口访问快 ...

  2. C++的编译链接与在vs中build提速

    通过gcc或msvc,clang等编译器编译出来的C++源文件是.o文件.在windows上也就是PE文件,linux为ELF文件,在这一步中,调用其它代码文件中的函数的函数地址是未知的(00000) ...

  3. 【krpano】图文案例

    KRPano图文案例可以展示图片和文字,并支持图片放大浏览,以及文本拖动等操作. 具体截图如下: 下载地址:http://pan.baidu.com/s/1qXQnPes 感谢群内小伙伴 快乐分享 本 ...

  4. 简述Spring Cache缓存策略

    一.简介 Spring框架提供了一种名为Spring Cache的缓存策略.Spring Cache是一种抽象层,它提供了一种方便的方式来管理缓存,并与Spring应用程序中的各种缓存实现(如EhCa ...

  5. Solution Set -「CSP-S 2020」

    Problem. 1 - Junior Julian 模拟模拟模拟摸死 CTR 的母. 考场代码: #include<cstdio> namespace solveIt { void re ...

  6. filebeat新filestream类型是否支持tail_files类似功能探究

    背景 试水搭建ELK,使用了ELK7.17.13版本,filebeat默认配置的input type已经是filestream而非旧版的log类型,开始了探索之旅. 信任ChatGPT导致的三次失败尝 ...

  7. SQL运用full join连接,decode函数,nvl函数进行列转行

    背景说明:full join连接,decode函数,nvl函数,结合生产背景理解更深刻: test_A表是现金业主某时间段的收益:test_B表是非现金业主某时间段的收益:对于业主,test_A表与t ...

  8. ERROR: Command errored out with exit status 1:

    Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting CairoSVG==2.4.2 Using cached ...

  9. Go 复合类型之字典类型介绍

    Go 复合类型之字典类型介绍 目录 Go 复合类型之字典类型介绍 一.map类型介绍 1.1 什么是 map 类型? 1.2 map 类型特性 二.map 变量的声明和初始化 2.1 方法一:使用 m ...

  10. 挑战程序设计竞赛 2.2 poj 3040 Allowance 贪心

    https://vjudge.csgrandeur.cn/problem/POJ-3040 /* 作为创纪录的牛奶产量的奖励,约翰决定每周给贝西一小笔零用钱.FJ拥有一组N(1 <= N < ...