[] 쿼리에 문제에 대한 해결 방법 [51nod1406]

[] 쿼리에 문제에 대한 해결 방법 [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("");
}

추천

출처www.cnblogs.com/Xing-Ling/p/11348359.html