[] 쿼리에 문제에 대한 해결 방법 [51nod1406]
포털 : 쿼리 \ ([51nod1406] \)
설명 [TITLE]
감안 \ (\ N-) 정수로 ([0,1000000] \에서 X \) \ 이 결정된다 \ (\ N-) 정수되는 \ (X \) 결과를 추구 이후 \을 ( X \) 얼마나 많은입니다.
[샘플]
样例输入:
3
2 3 3
样例输出:
3
2
3
2
0
0
...
...
...
0
(一共1000001个数,后面一共999997个0)
[데이터 범위]
(\ 100 \ %의 \) \ (1 \ leqslant N \ 10 ^ 6 \ leqslant) (a [I] \ leqslant 10 ^ 6 \ 1 \는 leqslant) \
[분석]
함께 \ (DP [I]는 \) 대표 \ (I는 \) 요건과 동일 (I는 \) \을 카운트 수로.
첫째, 이처럼 자체, 또는 그 자체와 동일한 조건의 수, \ (DP는 [I]는 \) 시퀀스의 초기 값을 부여 \ (I는 \) 발생 참조.
특정 이진수 들어 \ (A \) 중 어느 하나 인, \ (0 \) 비트가된다 \ (1 \)는 , 이진수 수득 \을 (B \) .
실측치 :
와 \ (A \) 요건과 동일 \ (A \) 와 동일한 수의 \ (B \) 요건 및 필요는 없다 같음 (B \) \ ,
함께 \ (B \) 요건과 동일 \ (B \) 의 동일한 번호 \ (A \) 와 요구 소정 같음하기 (A \)를 \ .
그 \ (ㄱ \) 프로그램은 충족해야합니다 \ (A \) 요구 사항을.
그래서 \ (DP \) 식 : \ (DP [J] + DP = [. J \ Oplus (I << 1)] \) , \ (J에서 \ [. 0,10 ^ 6] \) \ ( J \) \ (\ 및 (I <<. 1) == 0 \) 와 \ (j \ oplus (1 << I) \ leqslant 10 ^ 6 \)
과도한 출력 데이터로 인해, 그렇지 않으면 전체, 잃게 작성해야 \ (TLE \) .
시간 복잡도는 \ (O (MlogM) \) 여기서 \ (M = 10 ^ 6 \) .
【암호】
#include<algorithm>
#include<cstdio>
#define Re register int
const int N=1e6;
int n,a,dp[N+3];
inline void in(Re &x){
int f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
inline void out(int x){
if(x>9)out(x/10);
putchar(x%10+'0');
}
int main(){
in(n);
for(Re i=1;i<=n;i++)in(a),++dp[a];
for(Re i=0;i<20;i++)
for(Re j=0;j<=N;++j)
if(!(j&(1<<i))&&(j^(1<<i))<=N)dp[j]+=dp[j^(1<<i)];
for(Re j=0;j<=N;++j)out(dp[j]),puts("");
}