首页 > 其他分享 >[ARC106E] Medals 题解

[ARC106E] Medals 题解

时间:2023-12-07 13:46:47浏览次数:39  
标签:typedef ch int 题解 long ARC106E getchar Medals define

题目链接

题目链接

题目解法

感觉不难啊,怎么想到网络流和 \(hall\) 定理后面就屁都没想到呢

首先一眼网络流
先二分答案
考虑一个朴素的建图方法是:把每个人拆成 \(k\) 个点,然后往在的天连边,跑最大流,满流即合法

可以发现,跑网络流对这道题还说没有必要,因为只要判是否有完美匹配
不难想到 \(hall\) 定理,定理具体自己查

观察到 \(n\le 18\),所以考虑状压状物
考虑每个点拆分成的 \(k\) 个点连出去的边都相同,所以如果只包含了 \(i\) 拆分出去的一个点,一定不够极限,所以需要枚举的点集要么不包含 \(i\) 拆分的点,要么包含所有的 \(k\) 个点

当前天是邻边当且仅当它包含的人的集合与枚举的人的集合有交集
可以想到在补集上做文章,即补集与枚举的人的集合不交,不难发现可以高位前缀和优化

时间复杂度 \(O(n2^n\log nk)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=18;
int n,k,a[N],f[1<<N];
int main(){
    n=read(),k=read();
    F(i,0,n-1) a[i]=read();
    int l=0,r=4000000;
    while(l<r-1){
        int mid=(l+r)>>1;
        F(S,0,(1<<n)-1) f[S]=0;
        F(i,1,mid){
            int st=0;
            F(j,0,n-1) if(~((i-1)/a[j])&1) st|=1<<j;
            f[st]++;
        }
        F(i,0,n-1) F(S,0,(1<<n)-1) if(!(S>>i&1)) f[S^1<<i]+=f[S];
        bool flg=1;
        F(i,0,(1<<n)-1) if(__builtin_popcount(i)*k>mid-f[(1<<n)-1-i]){ flg=0;break;}
        if(!flg) l=mid;
        else r=mid;
    }
    printf("%d\n",r);
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

标签:typedef,ch,int,题解,long,ARC106E,getchar,Medals,define
From: https://www.cnblogs.com/Farmer-djx/p/17881810.html

相关文章

  • 【UVA 101】The Blocks Problem 题解(模拟+向量)
    计算机科学的许多领域使用简单、抽象的领域进行分析和实证研究。例如,早期的人工智能规划和机器人研究(STRIPS)使用了一个区块世界,其中机器人arm执行涉及块操作的任务。在这个问题中,您将在某些规则和约束下对一个简单的块世界进行建模。相当地与确定如何达到指定状态相比,您将“编程......
  • Maven无法下载fastdfs-client-java依赖问题解决
    一、分析原因控制台报错具体如下:并且pom.xml中以下依赖爆红:<dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifactId><version>1.29-SNAPSHOT</version></dependency>原因:因为fastdfs-clien......
  • [CF83E] Two Subsequences 题解
    [CF83E]TwoSubsequences题解思路定义\(overlap(a,b)\)为字符串\(a\)的后缀与\(b\)的前缀的最大相等的长度,有\(|f(a,b)|=|a|+|b|-overlap(a,b)\),下文称匹配为相邻两串的\(overlap\)。观察到每次操作之后,一定有一个序列是以\(a_i\)为结尾的。所以根据这个......
  • CF1900B题解
    原题思路略微思考不难得到,三个数字的数量之差的奇偶性是不会变的。因为一个数的数量减少了$1$,另一个数无论是增加$1$或是减少$1$,两者的差要么不变,要么增加/减少$2$,对奇偶性无影响。同时,如果另外两个数的数量变为$0$,它们数目的差一定是$0$。那么,我们只需要判断另外两个......
  • 【题解】CodeForces 686E Optimal Point
    传送门:https://codeforces.com/contest/686/problem/E前言:本题解来源于作者某天晚上和一位朋友的发电内容(没错,这个作者直接把自己和朋友发电时发的话用markdown排了一下,传上来了),当时本来就比较口语化,加上作者的做法又实在太过离谱,因此可能语言表述不够清晰,对此深感抱歉qwq;离......
  • 【题解】LibreOJ #3051「十二省联考 2019」皮配
    传送门:https://loj.ac/p/3051  首先,对于这样“少部分个体有特殊要求”的题目,我们先考虑,如果没有任何个体有特殊要求怎么做,然后再考虑怎么加上特殊要求;对于这道题,如果$k=0$,即没有学校有不喜欢的导师,那么,设总人数为$al$,城市$i$的人数和为$cit_i$、选择的阵营为$zy_i=0/......
  • UVA753 A Plug for UNIX 题解
    LinkUVA753APlugforUNIXQuestion有\(n\)个插座,\(m\)个设备和\(k\)种转换器,每种转换器有无限多个。转换器可以插着转换器用,每个插座或插头的类型可能不同,求最少剩多少个不匹配的设备Sulotion先考虑转换器连用的情况,用边表\(G[x][y]\)表示\(x\)类型可以转换成\(y......
  • UVA1395 Slim Span 题解
    LinkUVA1395SlimSpanQuestion求所有生成树中最大边权与最小边权差最小的,输出他们的差值Solution因为\(n\le100\)非常小,先把边从小到大排序,那么生成树的边肯定是排序后上的边连续的一块所以,可以枚举连续一块的起点\(L\),\(R\)从\(L\)往后推,判断全图连通性,如果已经完......
  • CF1809D Binary String Sorting 题解
    题意:思路:贪心:单调不降的$01$字符串,一定是一串连续的$0$再加上一串连续的$1$。由于每次操作的代价很大,所以需要在操作次数尽可能少的情况下,尽可能多地使用交换操作。由于$1$次交换操作,只能减少$1$个逆序对,当存在多个逆序对时,优先通过删除操作减少逆序对的......
  • ucup hefei 题解
    比赛链接B很有意思的题首先题目的要求为可以拆分成\(2\)个不相交的不降子序列根据\(dilworth\)定理,最小链覆盖\(=\)最长反链,所以要求最长反链\(\le2\)即原序列的逆序列的最长不降子序列长度\(\le2\)不难得到一个\(dp\)做法为:令\(f_{i,j}\)为到数\(i\),最长上......