bzoj2640 元素 線性基+貪心
阿新 • • 發佈:2017-10-13
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)) usingAAnamespace 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(); }
bzoj2640 元素 線性基+貪心