zoukankan      html  css  js  c++  java
  • CF736D Permutations(伴随矩阵)

    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();}
    
  • 相关阅读:
    ubuntu下使用golang、qml与ubuntu sdk开发桌面应用 (简单示例)
    Go Revel 学习指南
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    Go Revel
  • 原文地址:https://www.cnblogs.com/rikurika/p/13370126.html
Copyright © 2011-2022 走看看