P1795 无穷的序列_NOI导刊2010提高(05)
题目描述
有一个无穷序列如下:
110100100010000100000…
请你找出这个无穷序列中指定位置上的数字
输入输出格式
输入格式:
第一行一个正整数N,表示询问次数;
接下来的N行每行一个正整数Ai,Ai表示在序列中的位置。
输出格式:
N行,每行为0或l,表示序列第Ai位上的数字。
输入输出样例
输入样例#1: 复制
4 3 14 7 6
输出样例#1: 复制
0 0 1 0
说明
对于100%的数据有N≤1500000,Ai≤10^9
思路:前缀和+二分。
#include<map> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; map<int,bool>ma; int n,x,sum=1; int main(){ scanf("%d",&n); for(int i=1;i;i++){ ma[sum]=1,sum+=i; if(sum>1000000000) break; } while(n--){ scanf("%d",&x); if(ma[x]) printf("1\n"); else printf("0\n"); } }
STL TLE 90分
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int ma[44722]; int l,r,mid; int n,x,sum=1; int main(){ scanf("%d",&n); ma[1]=1; for(int i=2;i<=44721;i++) ma[i]=ma[i-1]+i-1; while(n--){ scanf("%d",&x); l=1;r=44721;int flag=0; for(int i=1;i<=32;i++){ mid=(l+r)/2; if(ma[mid]<x) l=mid+1; else if(ma[mid]>x) r=mid-1; else if(ma[mid]==x){ flag=1;break; } } if(flag) printf("1\n"); else printf("0\n"); } }
时间: 2024-09-30 21:11:36