码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-24 21:40:36      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:too   pre   次数   targe   else   思路   color   接下来   algo   

题目描述

有一个无穷序列如下:

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)

标签:too   pre   次数   targe   else   思路   color   接下来   algo   

原文地址:http://www.cnblogs.com/cangT-Tlan/p/7892264.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!