颓了十天回来做题果然……
感觉还是很有收获的,这两以前都没学过
bzoj1013: [JSOI2008]球形空间产生器sphere
poj1830 异或也可以当作加减那样做的。。。起始状态异或结束状态就得出答案,设的就是某个灯点不点
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int n; int gq[40][40],gc[40]; int guass() { int ch=n,fr=0; for(int j=1;j<=n;j++) { for(int i=j;i<=n;i++) if(gq[i][j]>0) { for(int k=1;k<=n;k++)swap(gq[i][k],gq[j][k]); swap(gc[i],gc[j]); break; } if(gq[j][j]==0) { if(gc[j]==1)return 0; else {fr++;continue;} } for(int i=1;i<=n;i++) { if(i==j)continue; if(gq[i][j]==1) { for(int k=j;k<=n;k++)gq[i][k]^=gq[j][k]; gc[i]^=gc[j]; } } } return 1<<fr; } int main() { int T; scanf("%d",&T); while(T--) { int x,y; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&gc[i]); for(int i=1;i<=n;i++) scanf("%d",&x), gc[i]^=x; memset(gq,0,sizeof(gq)); for(int i=1;i<=n;i++)gq[i][i]=1; while(scanf("%d%d",&x,&y)!=EOF) { if(x==0&&y==0)break; gq[x][y]=1; } int ans=guass(); if(ans==0)printf("Oh,it‘s impossible~!!\n"); else printf("%d\n",ans); } return 0; }
poj1830
hdu3949 求第k大。其实本质就是用高斯消元的思想,把每一位独立出来
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef unsigned long long uLL; const uLL maxp=(1LL<<63); uLL lt[110];bool bk; void insert(uLL x) { uLL Bin=maxp; for(int i=63;i>=0;i--) { if(x&Bin) { if(lt[i]==0) {lt[i]=x;return ;} else x^=lt[i]; } Bin>>=1; } bk=true; } uLL plen,p[110]; void rebuild() { uLL Bin1=maxp; for(int i=63;i>=0;i--) { if(lt[i]!=0) { uLL Bin=(Bin1>>1); for(int j=i-1;j>=0;j--) { if(lt[i]&Bin) lt[i]^=lt[j]; Bin>>=1; } } Bin1>>=1; } plen=0; for(int i=0;i<=63;i++) if(lt[i]!=0)p[plen++]=lt[i]; } void findkth(uLL x) { if(bk==true) { x--; if(x==0){printf("0\n");return ;} } if(x>=(1LL<<plen)){printf("-1\n");return ;} uLL ans=0,Bin=maxp; for(int i=63;i>=0;i--) { if(x&Bin) ans^=p[i]; Bin>>=1; } printf("%I64u\n",ans); } uLL a[11000]; bool cmp(uLL n1,uLL n2){return n1>n2;} int main() { freopen("1.in","r",stdin); freopen("1.out","w",stdout); int T,T_T=0; scanf("%d",&T); while(T--) { printf("Case #%d:\n",++T_T); int n;uLL x; scanf("%d",&n);bk=false; for(int i=1;i<=n;i++) { scanf("%I64u",&a[i]); if(a[i]==0)bk=true; } sort(a+1,a+n+1,cmp); memset(lt,0,sizeof(lt)); for(int i=1;i<=n;i++)insert(a[i]); scanf("%d",&n);rebuild(); while(n--) scanf("%I64u",&x), findkth(x); } return 0; }
hdu3949
原文地址:https://www.cnblogs.com/AKCqhzdy/p/9399344.html
时间: 2024-11-08 12:51:32