BZOJ2460: [BeiJing2011]元素

首先考虑一个xor为0的子集,如果去掉一个元素,那么xor就不等于0了,从而符合题意

去掉的元素肯定最小,或者说保留的元素最大,就可以使得ans最大

所以用贪心,从大到小取,用线性基维护一下即可,这是基于xor特殊性质的贪心

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<vector>
 6 #define MAXN 1000+10
 7 #define ll long long
 8 #define pb push_back
 9 #define ft first
10 #define sc second
11 using namespace std;
12 ll s[65];
13 int n;
14 pair<ll,int> a[MAXN];
15 bool check(ll t){
16     if(!t)return 0;
17     for(int i=63;i>=0;i--){
18         if((t>>i)&1){
19             t^=s[i];
20         }
21     }
22     return (t==0);
23 }
24 void ins(ll t){
25     for(int i=63;i>=0;i--){
26         if((t>>i)&1){
27             if(s[i]){
28                 t^=s[i];
29             }
30             else{
31                 s[i]=t;
32                 break;
33             }
34         }
35     }
36 }
37 bool comp(const pair<ll,int> &A,const pair<ll,int> &B){
38     return (A.sc>B.sc);
39 }
40 int main()
41 {
42     scanf("%d",&n);
43     for(int i=1;i<=n;i++)scanf("%lld%d",&a[i].ft,&a[i].sc);
44     sort(a+1,a+n+1,comp);
45     int ans=0;
46     for(int i=1;i<=n;i++){
47         if(!check(a[i].ft)){
48             ans+=a[i].sc;
49             ins(a[i].ft);
50         }
51     }
52     printf("%d\n",ans);
53     return 0;
54 }

 

posted @ 2018-01-18 12:01  white_hat_hacker  阅读(98)  评论(0编辑  收藏  举报