hdu2446 (二分搜索)

打表两个数组   然后二分就好
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "algorithm"
#include <queue>
#define N 1800000
#define  LL long long int
using 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:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值