hdu2446 (二分搜索)

来源:互联网 发布:c语言编写有窗口的程序 编辑:程序博客网 时间:2024/06/09 17:06
打表两个数组   然后二分就好#include <iostream>#include "stdio.h"#include "stdlib.h"#include "string.h"#include "algorithm"#include <queue>#define N 1800000#define  LL long long intusing namespace std;LL ss[N]={0},as[N]={0};LL find_one(LL n){    int l=1,r=N-1,mid;    while(l<r)    {        mid=(l+r)/2;        if(as[mid]<n)  l=mid+1;        else if(as[mid]>n)  r=mid-1;        else return mid;    }    return l;}LL find_two(LL n,LL tmp){    LL l=1,r=tmp,mid;    while(l<r)    {        mid=(l+r)/2;        if(ss[mid]<n) l=mid+1;        else if(ss[mid]>n) r=mid-1;        else return mid;    }    return l;}int main(){    int t;LL s;    for(int i=1;i<N;i++)        ss[i]=ss[i-1]+i;    for(int i=1;i<N;i++)        as[i]=as[i-1]+ss[i];    scanf("%d",&t);    while(t--)    {        scanf("%lld",&s);        LL  pos_heap=find_one(s);        if(as[pos_heap]<s) pos_heap++;        LL pos_two=find_two(s-as[pos_heap-1],pos_heap);        if(ss[pos_two]<s-as[pos_heap-1]) pos_two++;        LL pos_thr;        if(ss[pos_two]==s-as[pos_heap-1])  pos_thr=pos_two;        else pos_thr=s-as[pos_heap-1]-ss[pos_two-1];        printf("%lld %lld %lld\n" ,pos_heap,pos_two,pos_thr);    }    return 0;}

Distributed under GPLv3. | Project Homepage | Developer: 51isoft crccw | Current Style:Cerulean.

Select Style:
0 0
原创粉丝点击