线性基模板题 /************************************************************** Problem: 2460 User: syh0313 Language: C++ Result: Accepted Time:28 ms Memory:1304 kb ****************************************************************/ #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <algorithm> using namespace std; const int maxn=1010; int n,ans; long long p[70]; struct da{long long x;int y;}a[maxn]; bool cmp(da aa,da bb){return aa.y>bb.y;} int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lld%d",&a[i].x,&a[i].y); sort(a+1,a+n+1,cmp); for (int i=1;i<=n;i++) for (int j=62;j>=0;j--) if ((a[i].x>>j)&1) //如果线性基对这位有贡献 { if (!p[j]) {p[j]=a[i].x; ans+=a[i].y; break;} //如果这位之前没有贡献过,那就选当前这位(贪心) a[i].x^=p[j]; //如果之前这位已经被某个数x贡献过了,那就将now异或上x这样就表示now能被x线性表出 } printf("%d\n",ans); return 0; }