1. 程式人生 > >bzoj2640 元素 線性基+貪心

bzoj2640 元素 線性基+貪心

ostream cstring space struct -1 16px main isp code

線性基的話,我覺得就是把n個數的排列簡化成63個數,使其異或出來的數跟原來可以異或出來的數一樣

先把礦石按權值從大到小排序

一個一個往裏加

如果加進去的不合法,就放棄它,因為如果選了它,那麽比它權值大的礦石就要放棄

技術分享
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using
namespace std; const int N=1006; struct JI { ll order; ll val; bool friend operator < (JI a,JI b) { return a.val>b.val; } }ji[N]; ll n; ll p[68]; ll work() { ll ans=0; sort(ji+1,ji+1+n); for(int i=1;i<=n;++i) { for(int j=62;j>=0;--j)
if( (((ll)1<<j)&ji[i].order) ) { if(!p[j]) { p[j]=ji[i].order; break; } ji[i].order^=p[j]; } if(ji[i].order) ans+=ji[i].val; } return ans; }
int main(){ //freopen("in.in","r",stdin); scanf("%lld",&n); for(int i=1;i<=n;++i) scanf("%lld%lld",&ji[i].order,&ji[i].val); cout<<work(); }
AA

bzoj2640 元素 線性基+貪心