• 洛谷P4570 [BJWC2011]元素(线性基)


    传送门

    不知道线性基是什么东西的可以看看蒟蒻的总结

    考虑贪心

    将所有的矿石按价值从大到小排序

    如果一块矿石不会和之前的编号异或为0就加入

    这个只要判一下它能不能加进线性基里就可以了

    据说这个贪心的证明得用拟阵……反正我是不会

     1 //minamoto
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<algorithm>
     5 #define ll long long
     6 using namespace std;
     7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
     8 char buf[1<<21],*p1=buf,*p2=buf;
     9 inline ll read(){
    10     #define num ch-'0'
    11     char ch;bool flag=0;ll res;
    12     while((ch=getc())>'9'||ch<'0')
    13     (ch=='-')&&(flag=true);
    14     for(res=num;(ch=getc())<='9'&&ch>='0';res=res*10+num);
    15     (flag)&&(res=-res);
    16     #undef num
    17     return res;
    18 }
    19 const int N=1005;
    20 struct node{
    21     ll num;int p;
    22     node(){}
    23     node(ll num,int p):num(num),p(p){}
    24     inline bool operator <(const node &b)const
    25     {return p>b.p;}
    26 }a[N];
    27 ll b[64],num;int n,ans,p;
    28 inline bool insert(ll x){
    29     for(int i=63;i>=0;--i)
    30     if(x>>i&1){
    31         if(!b[i]) return b[i]=x,true;
    32         x^=b[i];
    33     }
    34     return false;
    35 }
    36 int main(){
    37 //    freopen("testdata.in","r",stdin);
    38     n=read();
    39     for(int i=1;i<=n;++i) num=read(),p=read(),a[i]=node(num,p);
    40     sort(a+1,a+1+n);
    41     for(int i=1;i<=n;++i)
    42     if(insert(a[i].num)) ans+=a[i].p;
    43     printf("%d
    ",ans);
    44     return 0;
    45 }
  • 相关阅读:
    C++中的friend函数详细解析(一)
    【图像处理算法】 直方图均衡化
    可降水量W:空中水文学名词初集(4)
    excel\docx
    WebService学习总结
    C#深入学习笔记Lock
    事件Event深入总结
    C#泛型委托与Lambda总结
    SQLServer事务与锁的基础概念总结
    委托Delegate深入总结
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9715864.html
Copyright © 2020-2023  润新知