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

0x35 高斯消元与线性空间

时间:2018-08-01 11:41:48      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:post   swap   mes   bzoj1013   tle   hellip   continue   poj   pac   

颓了十天回来做题果然……

感觉还是很有收获的,这两以前都没学过

bzoj1013: [JSOI2008]球形空间产生器sphere

poj1830 异或也可以当作加减那样做的。。。起始状态异或结束状态就得出答案,设的就是某个灯点不点

技术分享图片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int n;
int gq[40][40],gc[40];
int guass()
{
    int ch=n,fr=0;
    for(int j=1;j<=n;j++)
    {
        for(int i=j;i<=n;i++)
            if(gq[i][j]>0)
            {
                for(int k=1;k<=n;k++)swap(gq[i][k],gq[j][k]);
                swap(gc[i],gc[j]);
                break;
            }
        if(gq[j][j]==0)
        {
            if(gc[j]==1)return 0;
            else {fr++;continue;}
        }
        for(int i=1;i<=n;i++)
        {
            if(i==j)continue;
            if(gq[i][j]==1)
            {
                for(int k=j;k<=n;k++)gq[i][k]^=gq[j][k];
                gc[i]^=gc[j];
            }
        }
    }
    return 1<<fr;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int x,y;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&gc[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&x), gc[i]^=x;
            
        memset(gq,0,sizeof(gq));
        for(int i=1;i<=n;i++)gq[i][i]=1;
        while(scanf("%d%d",&x,&y)!=EOF)
        {
            if(x==0&&y==0)break;
            gq[x][y]=1;
        }
        
        int ans=guass();
        if(ans==0)printf("Oh,it‘s impossible~!!\n");
        else printf("%d\n",ans);
    }
    return 0;
}
poj1830

bzoj4004: [JLOI2015]装备购买

hdu3949 求第k大。其实本质就是用高斯消元的思想,把每一位独立出来

技术分享图片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef unsigned long long uLL;
const uLL maxp=(1LL<<63);

uLL lt[110];bool bk;
void insert(uLL x)
{
    uLL Bin=maxp;
    for(int i=63;i>=0;i--)
    {
        if(x&Bin)
        {
            if(lt[i]==0)
                {lt[i]=x;return ;}
            else
                x^=lt[i];
        }
        Bin>>=1;
    }
    bk=true;
}
uLL plen,p[110];
void rebuild()
{
    uLL Bin1=maxp;
    for(int i=63;i>=0;i--)
    {
        if(lt[i]!=0)
        {
            uLL Bin=(Bin1>>1);
            for(int j=i-1;j>=0;j--)
            {
                if(lt[i]&Bin)
                    lt[i]^=lt[j];
                Bin>>=1;
            }
        }
        Bin1>>=1;
    }
    plen=0;
    for(int i=0;i<=63;i++)
        if(lt[i]!=0)p[plen++]=lt[i];
    
}
void findkth(uLL x)
{
    if(bk==true)
    {
        x--;
        if(x==0){printf("0\n");return ;}
    }
    if(x>=(1LL<<plen)){printf("-1\n");return ;}
    
    uLL ans=0,Bin=maxp;
    for(int i=63;i>=0;i--)
    {
        if(x&Bin)
            ans^=p[i];
        Bin>>=1;
    }
    printf("%I64u\n",ans);
}

uLL a[11000];
bool cmp(uLL n1,uLL n2){return n1>n2;}
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    
    int T,T_T=0;
    scanf("%d",&T);
    while(T--)
    {
        printf("Case #%d:\n",++T_T);
        
        int n;uLL x;
        scanf("%d",&n);bk=false;
        for(int i=1;i<=n;i++)
        {
            scanf("%I64u",&a[i]);
            if(a[i]==0)bk=true;
        }
        sort(a+1,a+n+1,cmp);
        memset(lt,0,sizeof(lt));
        for(int i=1;i<=n;i++)insert(a[i]);
        
        scanf("%d",&n);rebuild();
        while(n--)
            scanf("%I64u",&x), findkth(x);
    }
    return 0;
}
hdu3949

 

0x35 高斯消元与线性空间

标签:post   swap   mes   bzoj1013   tle   hellip   continue   poj   pac   

原文地址:https://www.cnblogs.com/AKCqhzdy/p/9399344.html

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