https://www.nowcoder.com/acm/contest/84/D
这道题是这场比赛的防AK题
这道题乍一看挺难
其实打表找了找规律
有带上小学时候学奥赛的一个定理
然后大胆猜了个结论
之后不知道怎么维护不超时
然后问了陈尊龙
果然厉害
秒出答案
然后我把题切了
至于怎么做的
看代码来理解吧
这里我就不解释了
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int A[N];
int B[35];
struct P{
int a,b;
}C[35];
bool cmp(P x,P y){
return x.a>y.a;
}
int main(){
int n;
cin>>n;
set<int> S;
for(int i=1;i<=n;++i){
cin>>A[i];
S.insert(A[i]);
}
for(int i=1;i<=n;++i){
int a=A[i],b=0;
while(a){
if(a%2==1) B[b]=i;
++b;
a/=2;
}
for(int i=0;i<=30;++i)
C[i].a=B[i],C[i].b=i;
sort(C,C+30+1,cmp);
int c=0;
int d=0;
while(d<=30){
while(d<30&&C[d+1].a==C[d].a){
c|=(1<<C[d].b);
++d;
}
c|=(1<<C[d].b);
++d;
S.insert(c);
}
}
cout<<S.size()<<endl;
}