码迷,mamicode.com
首页 > 其他好文 > 详细

CF736D Permutations(伴随矩阵)

时间:2020-07-24 21:37:12      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:ret   getch   getc   problem   html   puts   方案   break   rac   

CF736D Permutations(伴随矩阵)

Luogu

题解时间

首先把边直接放进邻接矩阵,

很明显行列式的奇偶和方案数的奇偶一样。

设 $ A_{ i , j } $ 为矩阵的该行列的余子式去掉一条边 $ x,y $ 后是否还为奇数等同于 $ A_{ x ,y } $ 是否为偶数。

至于如何快速求出所有余子式?

伴随矩阵

$ A^{ * } = ( A_{ i , j } )^{T} $ ,T代表转置。

有结论 $ A^{ * } = A^{ -1 } | A | $ ,在此不作证明。

然后直接求逆就完事,用bitset优化 $ O(\frac{ n^{ 3 } }{ w }) $ 。

#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
	TP ret=0,f=1;char ch=getchar();
	while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
	while(ch>=‘0‘&&ch<=‘9‘){ret=ret*10+(ch-‘0‘);ch=getchar();}
	tar=ret*f;
}
template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
namespace RKK
{
const int N=2011,M=500011;
int n,m;
bitset<N<<1> a[N];
int ex[M],ey[M];
void gauss()
{
	for(int l=1;l<=n;l++)
	{
		int e=0;for(int i=l;i<=n;i++)if(a[i][l]){e=i;break;}
		if(!e) return (void)(cerr<<"WDNMD"<<endl);
		if(e&&e!=l) swap(a[e],a[l]);
		for(int i=1;i<=n;i++)if(i!=l&&a[i][l]) a[i]^=a[l];
	}
}
int main()
{
	read(n,m);
	for(int i=1;i<=m;i++) read(ex[i],ey[i]),a[ex[i]][ey[i]]=1;
	for(int i=1;i<=n;i++) a[i][n+i]=1;
	gauss();for(int i=1;i<=m;i++) puts(a[ey[i]][n+ex[i]]?"NO":"YES");
	return 0;
}
}
int main(){return RKK::main();}

CF736D Permutations(伴随矩阵)

标签:ret   getch   getc   problem   html   puts   方案   break   rac   

原文地址:https://www.cnblogs.com/rikurika/p/13370126.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!