bitset

BZOJ3687

#include <cstdio>
#include <bitset>
using namespace std;

  bitset <2000001> f;
  int n;

  int main(){      
      scanf("%d",&n);
      f[0]=1;
      for (int i=1;i<=n;i++){
        int t;
        scanf("%d",&t);
      f=f^(f<<t);    
    }
    int ans=0;
    for (int i=1;i<=2000000;i++)
      if (f[i])
        ans^=i;
    printf("%d
",ans);
  }

 ____________________________________________
BZOJ3346

#include <cstdio>
#include <bitset>
#include <map>
#include <algorithm>
using namespace std;
 
  bitset <10005> f[10005];
  map <int,int> mp;
  int n,m,deg[10005];
 
  struct data{
    int x,y,len;
  }sid[100005];
 
  int mycomp(const data&a,const data&b){
    return(a.len<b.len);
  }
   
  int check(int mid){
    for (int i=1;i<=n;i++) f[i].reset();
    int po=1;
    while (po<=m&&sid[po].len<=sid[mid].len){
      f[sid[po].x][sid[po].y]=1;
      po++; 
    }
    for (int i=1;i<=n;i++) deg[i]=f[i].count();
     
    for (int i=1;i<=n;i++)
      if (2*deg[i]>=n)
        for (int j=1;j<=n;j++)
         if (deg[i]+deg[j]>=n)
          if ((f[i]|f[j]).count()==n)
            return(1);
     
    return(0);          
  }
 
  int main(){   
    scanf("%d%d",&n,&m);
    int cnt=0;
    for (int i=1;i<=m;i++){
      int t1,t2,t3;
      scanf("%d%d%d",&t1,&t2,&t3);
      if (mp[t1*(n+1)+t2]){
        sid[mp[t1*(n+1)+t2]].len=min(sid[mp[t1*(n+1)+t2]].len,t3);  
      }else{
        sid[mp[t1*(n+1)+t2]=++cnt].len=t3;
        sid[cnt].x=t1;sid[cnt].y=t2;
      }
    }
    m=cnt;
    sort(sid+1,sid+m+1,mycomp);
     
    int l=1,r=m+1;
    while (l<r){
      int mid=(l+r)>>1;
      if (check(mid)) r=mid;else l=mid+1;
    }
     
    if (l==m+1) printf("No solution
");else printf("%d
",sid[l].len);
  }
原文地址:https://www.cnblogs.com/zhujiangning/p/6349488.html