首页 > 其他分享 >题解:【AT Educational DP Contest-O】 Matching

题解:【AT Educational DP Contest-O】 Matching

时间:2023-06-19 17:34:20浏览次数:49  
标签:Educational read 题解 void long template inline Matching getchar

题目链接

来点位运算优化,目前也是拿下了洛谷最优解,比第二名快一倍:

#include<bits/stdc++.h>
#define int long long
#define btp(x) __builtin_popcount(x)
#define lowbit(x) ((x)&(-x))
using namespace std;

namespace FastIO
{
    template<typename T=int> inline T read()
    {
        T s=0,w=1; char c=getchar();
        while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
        while(isdigit(c)) s=(s*10)+(c^48),c=getchar();
        return s*w;
    }
    template<typename T> inline void read(T &s)
    {
        s=0; int w=1; char c=getchar();
        while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
        while(isdigit(c)) s=(s*10)+(c^48),c=getchar();
        s=s*w;
    }
    template<typename T,typename... Args> inline void read(T &x,Args &...args)
    {
        read(x),read(args...);
    }
    template<typename T> inline void write(T x,char ch)
    {
        if(x<0) x=-x,putchar('-');
        static char stk[25]; int top=0;
        do {stk[top++]=x%10+'0',x/=10;} while(x);
        while(top) putchar(stk[--top]);
        putchar(ch);
        return;
    }
}
using namespace FastIO;

bool Mbe;

namespace LgxTpre
{
	static const int MAX=21;
	static const int Mod=1e9+7;
	
	int n,f[1<<MAX],g[MAX];
	template<typename T> inline void Madd(T &a,T b) {a=a+b>Mod?a+b-Mod:a+b;}
		
	inline void dry()
	{
		read(n),f[0]=1;
		for(int i=0;i<n;++i) for(int j=0;j<n;++j) g[i]|=read()<<j;
		for(int S=1,i=btp(S);S<(1<<n);++S,i=btp(S)) for(int T=S&g[i-1];T;T&=T-1) Madd(f[S],f[S&(~(lowbit(T)))]);
		write(f[(1<<n)-1],'\n');
	}
}

bool Med;

signed main()
{
	fprintf(stderr,"%.3lf MB\n",abs(&Med-&Mbe)/1048576.0);
    int Tbe=clock();
    LgxTpre::dry();
    int Ted=clock();
    cerr<<1e3*(Ted-Tbe)/CLOCKS_PER_SEC<<" ms\n";
    return (0-0);
}

代码非常好理解。首先是存关系,直接压成二进制表示有无边就好了,记关系集合为 \(g\)。记当前集合为 \(S\),找二进制下有几个 \(1\),可以直接用 __builtin_popcount,记为 \(i\)。钦定当前是第 \(i\) 个左部点向右匹配,直接将 \(g_i\) 和 \(S\) 取交就是可匹配的右部点集合,记为 \(T\)。用类似枚举子集的操作遍历 \(T\) 二进制下的每个 \(1\),可以每次去掉 \(T\) 二进制下最后一个 \(1\)。要从 \(S\) 中依次枚举去掉哪一个 \(1\),相当于把 \(T\) 的最后一个 \(1\) 去掉后全部取反再和 \(S\) 取交,快速找 \(1\) 可以用 lowbit 加速。

当然还有进一步优化的空间:少取几次模,把 #define int long long 去了等。

标签:Educational,read,题解,void,long,template,inline,Matching,getchar
From: https://www.cnblogs.com/LittleTwoawa/p/17491696.html

相关文章

  • SecureCRT连接慢的问题解决
    选定SSH2,选择Authentication,勾选Password,然后将该选项上移,挪到第一位即可 修改SecureCRT配置目录(C:\Users\manager\AppData\Roaming\VanDyke\Config\)的Sessions子目录下对应的服务器ini配置文件,GSSAPIMethod设置的值为none,重启SecureCRT,连接贼快   原贴:1、https:/......
  • Tuxedo服务无法启动的问题解决(涉及MP下tlisten和TLOG的报错)
    今天同事说有一个Tuxedo应用在做测试,但重启了机器和Tuxedo环境后,服务仍无法启动,这次的问题排查和处理比较典型,值得梳理一次。应用环境:OS:SunOS5.9Tuxedo:9.1,MP双机环境问题现象:由于服务不可用,之前有同事使用kill干掉了一些Tuxedo进程,但无法确定具体范围。重启了服务器和Tuxedo......
  • MySQL数据字典提示1146不存在的问题解决
    最近某套MySQL因为磁盘挂载问题,异常宕机,拉起后,数据库能正常访问了,但是在error.log一直提示这个错误,[ERROR]InnoDB:Table`mysql`.`innodb_table_stats`notfound.2021-09-03T08:26:52.446564Z2[ERROR]InnoDB:Fetchofpersistentstatisticsrequestedfortable`jira`.`c......
  • maltego的 卡 慢 没反应 的问题解决方法
    maltego的卡慢没反应的问题主要是因为它要在国外下载和认证一些东西,导致软件无法正常访问。解决方法:配置带理,软件内部就支持,打开选择设置,    选择手动指定,填入服务器ip和端口,我使用链接本地服务器带理,服务器要允许局域网连接,并且关闭服务器上的防火墙,如果......
  • AtCoder Beginner Contest 306 题解 A - E
    A-Echo题目大意给定一个字符串,需要把它每个字符重复输出。解题思路可以读完整个字符串,也可以按照字符读一个输出两个。ACCode#include<iostream>#include<algorithm>#include<cstring>#include<numeric>#defineendl'\n'#defineiosios::sync_with_stdio(fals......
  • 小程序授权常见问题解析及解决方案
    引言小程序作为一种轻便、易用的应用形式,正在成为许多企业和个人开发者的首选。在用户使用小程序时,需要授权相应的权限才能获取更好的使用体验。但是,有时会遇到授权失败或出现安全隐患等问题。本文将从常见问题的角度出发,为大家解析小程序授权常见问题及其解决方案。下午一直犯困吟......
  • 题解:【ABC168F】 . (Single Dot)
    题目链接挺套路的题。如果值域和线段数量同阶,可以预处理不能越过的线段,使用状压四个方向记录每个节点能不能往这个方向走,然后直接爆搜就好了,标记上能走到哪些地方。但这个值域一看就是没有救的,于是就要拿出来离散化了。把线段的横纵坐标都拎出来离散化,依然是同样的预处理,然后从离......
  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)个人题解
    RC-u4变牛的最快方法思路最短编辑距离+记录路径板子题,不懂最短编辑距离的可以看看网上的博客。不懂为什么官方题解用的bfs写法,然后网上所有的题解就是bfs了。我这里就是双重for循环实现,参考下写法即可。代码点击查看代码#include<bits/stdc++.h>#definexfirst#definey......
  • CF1840C题解
    题目描述题目传送门\(T\)组数据,每组数据给定\(n\),\(k\),\(q\)和一个长度为\(n\)的数组\(a\),求\(a\)中长度大于等于\(k\)且最大值小于等于\(q\)的序列个数。\(\sum{n}\le2e5\)。题目解析解法一:数据结构解法显然可以利用数据结构维护。考虑ST表预处理出区间最大......
  • JOI Final 2020 题解
    JOI2020JustLongNeckties首先一定是贪心将两个从小到大排。然后考虑维护\(a_i-b_i\)的前缀max与\(a_{i+1}-b_i\)的后缀max即可。https://qoj.ac/submission/113106JOI2020JJOOII2考虑维护出每个点往前跳\(k\)个J/O/I跳到哪里。于是枚举右端点,然后往前跳找......