1. 程式人生 > >0x35 高斯消元與線性空間

0x35 高斯消元與線性空間

jloi2015 tin 本質 空間 else 消元 none lose 第k大

頹了十天回來做題果然……

感覺還是很有收獲的,這兩以前都沒學過

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 高斯消元與線性空間