洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

Posted 一蓑烟雨任生平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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");
    }
}

 

以上是关于洛谷 P1795 无穷的序列_NOI导刊2010提高(05)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1767 家族_NOI导刊2010普及(10)

洛谷——P1767 家族_NOI导刊2010普及(10)

洛谷P1776 宝物筛选_NOI导刊2010提高(02)

洛谷P1801 黑匣子_NOI导刊2010提高(06)

洛谷 P1807 最长路_NOI导刊2010提高(07)

洛谷 P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)