zoj - 2460 元素 —— 線性基
阿新 • • 發佈:2018-11-12
思路:要使得最後得到的魔力值最大,只需要根據礦石的魔力值從大到小使用
幾個數異或,不能和之前能異或出的數相同,恰好是線性基插入操作
#include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #include <string> #include <cstring> #include <algorithm> using namespace std; #define ll long long #define max_ 200100 #define mod 1000000007 #define inf 0x3f3f3f3f int n; ll p[100]; struct node { ll id; ll value; bool operator < (const node &a)const { return value>a.value; } }; struct node num[1010]; ll insert(int x) { ll now=num[x].id; for(int i=62;i>=0;i--) { if((now>>i)&1) { if(p[i]) { now=now^p[i]; } else { p[i]=now; return num[x].value; } } if(now==0) break; } return 0; } int main(int argc, char const *argv[]) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld%lld",&num[i].id,&num[i].value); } sort(num+1,num+1+n); ll sum=0; for(int i=1;i<=n;i++) { sum+=insert(i); } printf("%lld\n",sum ); return 0; }