题目解读:二分查找+数学。多组输入,多次访问,用一个数组保存每一层有多少个数字,再用另一个数组保存每一层最后一个之前总共有多少个数字,然后二分查找。肯定得用数组存下来,而且数组一定有边界,不然访问这么多次肯定TLE。
做题时的误区:在一层中,光看左边那一个,没注意到右边每一行最后一个正好和每层的包含数字的多少相等,严重怀疑我的眼是瞎的,╮(╯▽╰)╭。打表没确定边界乱打表,根本就跑不出来,(⊙o⊙)…。也是够笨的,边界肯定存在,我连怎么找都不会了。打懵逼了,陷进去出不来了,好菜╮(╯▽╰)╭。
赛后补题:看了一篇好的博客瞬间明了,而且二分还可以用STL里的lower_bound(),O(∩_∩)O哈哈~简洁明了。博客链接
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1100000;
ll a[maxn],b[maxn];
void start()
{
a[1]=1;b[1]=1;
for(int i=2;i<maxn;i++)
a[i]=i+a[i-1];
for(int i=2;i<maxn;i++)
b[i]=a[i]+b[i-1];
}
int main()
{
start();
int t;cin>>t;
while(t--)
{
ll n;cin>>n;
ll n1=lower_bound(b,b+maxn,n)-b;
n-=b[n1-1];
ll n2=lower_bound(a,a+maxn,n)-a;
n-=a[n2-1];
cout<<n1<<" "<<n2<<" "<<n<<endl;
}
return 0;
}