0x35 高斯消元与线性空间

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

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

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

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

时间: 2024-08-29 04:58:50

0x35 高斯消元与线性空间的相关文章

线性空间和异或空间(线性基)bzoj4004贪心+高斯消元

线性空间:是由一组基底构成的所有可以组成的向量空间 对于一个n*m的矩阵,高斯消元后的i个主元可以构成i维的线性空间,i就是矩阵的秩 并且这i个主元线性无关 /* 每个向量有权值,求最小权极大线性无关组 本题是使用贪心策略的高斯消元 由输入给出的n个物品,每个物品有m种属性,和价格price 如果a物品的属性可以由其他已有物品的属性组合出,那么a可以不必购买 问最少花掉多少钱,使得所有物品都可以组合出 首先构建n*m矩阵,然后高斯消元 在求第i个主元时,取价格最小的那个即可 可用反证法证明 */

[JLOI2015]装备购买 (高斯消元)

[JLOI2015]装备购买 \(solution:\) 首先这道题的题面已经非常清晰的告诉我们这就是线性空间高斯消元的一道题(可以用某些装备来表示另一件装备,这已经不能再明显了),只是这道题要求我们求出花费最小的方案,这个我们可以直接贪心,如果有多个装备可以匹配某一个属性,那么我们选价值最小的那一个(这个可以用线性空间的定义证明),价值大的尽量往后再选(选到最后剩下一些价格大的不买即可) \(code:\) #include<iostream> #include<cstdio>

poj_1222_高斯消元

第一次学习使用高斯消元,将灯板化为线性方程组,进行求解. /*######################################################################### # File Name: poj_1222.cpp # Author: CaoLei # Created Time: 2015/7/20 15:48:04 ###################################################################

HDU 4870 Rating(高斯消元)

HDU 4870 Rating 题目链接 题意:一个人注册两个账号,初始rating都是0,他每次拿低分的那个号去打比赛,赢了加50分,输了扣100分,胜率为p,他会打到直到一个号有1000分为止,问比赛场次的期望 思路:f(i, j)表示i >= j,第一个号i分,第二个号j分时候,达到目标的期望,那么可以列出转移为f(i, j) = p f(i', j') + (1 - p) f(i'' + j'') + 1 f(i', j')对应的是赢了加分的状态,f(i'', j'')对应输的扣分的状态

【BZOJ 4171】 4171: Rhl的游戏 (高斯消元)

4171: Rhl的游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 74  Solved: 33[Submit][Status][Discuss] Description RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色 .每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子 ),黑变白,白变黑.RHL希望把所有格子都变成白色的.不幸

POJ 1830 开关问题 高斯消元,自由变量个数

http://poj.org/problem?id=1830 如果开关s1操作一次,则会有s1(记住自己也会变).和s1连接的开关都会做一次操作. 那么设矩阵a[i][j]表示按下了开关j,开关i会被操作一次,记得a[i][i] = 1是必须的,因为开关i操作一次,本身肯定会变化一次. 所以有n个开关,就有n条方程, 每个开关的操作次数总和是:a[i][1] + a[i][2] + ... + a[i][n] 那么sum % 2就代表它的状态,需要和(en[i] - be[i] + 2) % 2

BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高斯消元判断是否和已选择的线性相关 每一位记录pivot[i]为i用到的行 枚举要加入的数字的每一个二进制为1的位,如果有pivot[i]那么就异或一下(消元),否则pivot[i]=这个数并退出 如果最后异或成0了就说明线性相关... #include <iostream> #include &l

[bzoj1013][JSOI2008]球形空间产生器sphere-题解[高斯消元]

Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数n(1<=N=10).接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标.每一个实数精确到小数点后6位,且其绝对值都不超过20000. Output 有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开.每个实数精确到

[spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)

In some countries building highways takes a lot of time... Maybe that's because there are many possiblities to construct a network of highways and engineers can't make up their minds which one to choose. Suppose we have a list of cities that can be c