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 }

 

转载于:https://www.cnblogs.com/w-h-h/p/8309485.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值