P11613 题解
DaiRuiChen007 · · 题解
Problem Link
首先转成最大独立集,对图
因此这两个点邻域相同,讨论两点间是否有边,如果有边那么两个点至多选一个,看成删除一个点,否则必定同时选或不选,生成一个大小为
那么不断合并大小相同的两个点,最终图上会剩若干大小不同的点,设为
很显然我们的策略就是按
那么记
记
那么
然后考虑
所以
时间复杂度
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1<<14|5;
bitset <MAXN> f,g,h,z;
vector <array<int,2>> qy[MAXN];
int n,q;
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>q;
for(int i=1,x,y;i<=q;++i) cin>>x>>y,n=max(n,x),qy[x].push_back({x-y,i});
f[0]=1;
for(int i=1;i<=n;++i) {
h.reset(),g.reset();
for(int x=1;x<=i;++x) {
h[x]=f[x-1]^f[x+(x&-x)-1];
if(h[x]) g.flip(x),g.flip(x&(x-1));
}
f=h;
for(auto o:qy[i]) z[o[1]]=g[o[0]];
}
for(int i=1;i<=q;++i) cout<<z[i]<<"\n";
return 0;
}