python基本語法(二)
阿新 • • 發佈:2021-08-09
題目
分析
完全不明白出題人是不是腦子出了點問題,資料範圍出 \(1000\) ,一度讓我以為是 \(n^2\log n\)。。
看上去很厲害,確實不太好想,但是如果知道這題要用線性基應該就明白了。
首先一個數存線上性基裡面,它最多可以作為一位的基底。
也就是說一個數最多可以影響一位的情況。
那其實我們能選的就那幾個,只要線性空間完備了,其他的啥都不能選了。
其實也就是給出了 \(n\) 個向量,讓你選一些,要求每一個向量必須跟集合內其它向量線性無關。
而且每一個向量有權值,於是答案就是貪心的選最大的即可。
直接排序然後從大往小選即可。
程式碼
#include<bits/stdc++.h> using namespace std; template <typename T> inline void read(T &x){ x=0;char ch=getchar();bool f=false; while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=f?-x:x; return ; } template <typename T> inline void write(T x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10^48); return ; } #define ll long long #define ull unsigned long long #define inc(x,y,mod) (((x)+(y))>=(mod)?(x)+(y)-(mod):(x)+(y)) #define dec(x,y,mod) ((x)-(y)<0?(x)-(y)+(mod):(x)-(y)) #define rep(i,x,y) for(int i=(x);i<=(y);i++) #define dep(i,y,x) for(int i=(y);i>=(x);i--) const int N=1e5+5,NM=62,M=2e5+5,MOD=1e9+7; int n,m; struct node{ ll x,y; inline bool operator < (const node &B)const{return y>B.y;} }a[N]; ll d[N]; ll sum; inline void Insert(ll x,ll y){ for(int i=NM;~i;i--){ if(x&(1ll<<i)){ if(d[i]) x^=d[i]; else{d[i]=x;sum+=y;return ;} } } return ; } signed main(){ ios::sync_with_stdio(false); read(n); for(int i=1;i<=n;i++) read(a[i].x),read(a[i].y); sort(a+1,a+n+1); for(int i=1;i<=n;i++) Insert(a[i].x,a[i].y); write(sum); return 0; }