[bzoj4300]绝世好题
我们考虑原题可以转化为以下问题 将所有a&b不等于0的连边,跑最长路
然后考虑优化建图,按二进制位建图然后我们发现只用连相邻边。
然后发现原图是DAG可以直接dp搞出来就没了
- 代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=4e6+5;
int a[N],n;
int hed[N],d[N],to[M],nxt[M],cnt;
void adde(int u,int v){
++cnt;to[cnt]=v,nxt[cnt]=hed[u];hed[u]=cnt;d[v]++;
}
int last[40];
queue<int>Q;
int dst[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
adde(0,i);
for(int t=0;(1ll<<t)<=1ll*a[i];++t){
if((a[i]>>t)&1){
if(last[t])adde(last[t],i);
last[t]=i;
}
}
}
int ans=1;
Q.push(0);
while(!Q.empty()){
int u=Q.front();Q.pop();
ans=max(ans,dst[u]);
for(int i=hed[u];i;i=nxt[i]){
int v=to[i];
dst[v]=max(dst[v],dst[u]+1);
d[v]--;
if(!d[v])Q.push(v);
}
}
printf("%d\n",ans);
}