打表两个数组 然后二分就好 #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: