洛谷 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
");
        else printf("0
");
    }
}
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
");
        else printf("0
");
    }
}
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
原文地址:https://www.cnblogs.com/cangT-Tlan/p/7892264.html