首页 > 其他分享 >[ABC313F] Flip Machines

[ABC313F] Flip Machines

时间:2023-08-24 23:11:28浏览次数:45  
标签:ABC313F int LL Flip ret up leq card Machines

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,int,LL,Flip,ret,up,leq,card,Machines
From: https://www.cnblogs.com/mekoszc/p/17655432.html

相关文章

  • Ciel and Flipboard
    CielandFlipboard一道好题,很有思维难度。首先,我们发现\(n\)很小,所以对于一些位置应该是可以枚举的,再通过一些限制来确定其他位置。对于操作的矩阵\(m*m\),我们发现中间一行必会被操作,而\(i\)和\(i+m\)行有且仅有一个被操作,那么设\(f_{i,j}\)表示\(i\)行\(j\)......
  • 【笔记】机器学习基础 - Ch5. Support Vector Machines
    5.1Linearclassification考虑如下问题:\(\mathbb{R}^N\)上的\(\calX\)服从某个未知分布\(\calD\),并由目标函数\(f:\calX\toY\)映射到\(\{-1,+1\}\)。根据采样\(S=(({\bfx}_1,y_1),\dotsb,({\bfx}_m,y_m))\)确定一个二分类器\(h\in\calH\),使得其泛化......
  • [ABC313F] Flip Machines
    一种很新的折半/根号分治。手玩一下可以证明一个机器集合\(S\)的期望,先把\(S\)中\(x=y\)的机器对应的卡片翻好面,对于剩下的机器,如果一张卡片被至少一个机器覆盖过(即\(x=i\)或\(y=i\)),那么它的期望是\(\dfrac{a+b}{2}\),否则就是\(a\)。首先把\(x_i=y_i\)的机器处理掉......
  • ARC134F Flipping Coins
    pb讲课没讲的题,感觉很牛逼啊!但不是牛逼在多项式,因为多项式大家应该都会。考虑从前往后扫的过程,只要有正面就翻成反面,所以最后只有可能是当\(p_i<i\)且\(i\)没有被翻面时才对\(k\)有贡献。那么考虑一条链\(1\to2\to\cdots\tom\),并且\(\forall1\lei<m,p_i=i+1\),那......
  • LeetCode 519. Random Flip Matrix 哈希Map
    Thereisanmxnbinarygridmatrixwithallthevaluesset0initially.Designanalgorithmtorandomlypickanindex(i,j)wherematrix[i][j]==0andflipsitto1.Alltheindices(i,j)wherematrix[i][j]==0shouldbeequallylikelytobereturne......
  • 学习AdapterViewFlipper 图片、文字 轮播动画控件
    1\.问题/坑点1.1item宽高不生效问题需要注意的是,AdapterViewFlipper在布局时,宽高一定要用match_parent或者具体dp值。如果宽、高中使用了wrap_content时,会导致AdapterViewFlipper容器的宽高,最终变成第一个item的宽高。即使后续item的宽高超过第一个item,也不会生效,内容显......
  • 【每日一题】Problem 327A - Flipping Game
    原题解决思路计算数字"1"的最大数目,可以转换成计算数组最大和,即求\(maxSum(oldArraySum-(1\rightarrow0)+(0\rightarrow1))\RightarrowoldArraySum+maxSum(flipSum)\)误区注意:题目要求必须执行一次,因此起始值不是0而是-1#include<bits/stdc++.h>intm......
  • Flip-Flop Hardening and Selection for Soft Error and Delay Fault Resilience
    Flip-FlopHardeningandSelectionforSoftErrorandDelayFaultResilience​​https://ieeexplore.ieee.org/document/5372275Thetraditionaltestmodelofgo/no-gotestingbeingquestionedbyincreasingdelayfaultmanifestationshasbecomeevenfurtherc......
  • POJ 1753 Flip Game(枚举+递归)
    传送门思路是别人的,自己理解了半天,真是渣渣。对于自己,路还长,年轻人。对任意一个格子来说,翻动偶数次等于没翻,翻动奇数次等于翻一次,所以只需考虑翻一次的情况。一共16个格子,每个格子只有翻和不翻,所以最多16步,最少0步,题目要求最少的步数,所以0——>16枚举,看哪一步先成功就是最优解。使......
  • AtCoder Beginner Contest 200 F Minflip Summation
    洛谷传送门AtCoder传送门显然的策略:选择全部\(0\)段变成\(1\),或选择全部\(1\)段变成\(0\)。归纳可得一般性的结论:设字符串中\(s_i\nes_{i+1}\)的位置数为\(k\),答案为\(\left\lceil\frac{k}{2}\right\rceil\)。因为在模意义下不能上取整,考虑记\(k\)的奇偶性(这样......