51nod 1406 与查询

来源:互联网 发布:c语言的应用范围 编辑:程序博客网 时间:2024/05/01 22:24

很巧妙的DP转移方式。

#include<bits/stdc++.h>using namespace std;const int MAXN=1e6+1;int sum[MAXN];void read(int&a){    char ch;while(!((ch=getchar())>='0')&&(ch<='9'));    a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';}inline void prin_d(int x){    if (x > 9)    {        prin_d(x / 10);    }    putchar(x % 10 + '0');    return ;}int main(){int n,i,j,mx,tmp,mxdig,x;while(~scanf("%d",&n)){mx=0;memset(sum,0,sizeof(sum));for(i=0;i<n;i++){read(x);mx=max(mx,x);sum[x]++;}tmp=mx;mxdig=0;while(tmp){mxdig++;tmp>>=1;} for(j=mxdig;j>=0;j--){for(i=1;i<=mx;i++){if((i>>j)&1)sum[i-(1<<j)]+=sum[i];}}sum[0]=n;for(i=0;i<MAXN;i++){prin_d(sum[i]);puts("");}}}


0 0
原创粉丝点击