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); }