51nod1406 与查询

这题卡I/O。。。dp一下。。。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
const int BufferSize=10000000;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
    if(head==tail) {
        int l=fread(buffer,1,BufferSize,stdin);
        tail=(head=buffer)+l;
    }
    return *head++;
}
inline int read() {
    int x=0,f=1;char c=Getchar();
    for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
    return x*f;
}
char sh[15];
void print(int x){
	if(!x) {
		puts("0");return ;
	}
	int cnt=0;
	while(x) sh[++cnt]=x%10,x/=10;
	dwn(i,cnt,1) putchar(sh[i]+48);
	putchar('
');
}
const int nmax=1e6+5;
const int inf=0x7f7f7f7f;
int ans[nmax];
int main(){
	int n=read(),u,mx=0;
	rep(i,1,n) ans[u=read()]++,mx=max(mx,u);
	rep(i,0,20) rep(j,1,mx) if(j&(1<<i)) ans[j-(1<<i)]+=ans[j];
	ans[0]=n;
	rep(i,0,1000000) print(ans[i]);
	return 0;
}     

  

题目来源: CodeForces
基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
 收藏
 关注

有n个整数。输出他之中和x相与之后结果为x的有多少个。x从0到1,000,000

Input
第一行输入一个整数n。(1<=n<=1,000,000).
第二行有n个整数a[0],a[1],a[2],...a[n-1],以空格分开.(0<=a[i]<=1,000,000)
Output
对于每一组数据,输出1000001行,第i行对应和i相与结果是i的有多少个数字。
Input示例
3
2 3 3
Output示例
3
2
3
2
0
0
……
后面还有很多0
System Message (题目提供者)
 
 
原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5910743.html