蓝桥杯12届国B 123
题目描述
小蓝发现了一个有趣的数列,这个数列的前几项如下:
1,1,2,1,2,3,1,2,3,4,⋯
小蓝发现,这个数列前 1 项是整数 1,接下来 2 项是整数 1 至 2,接下来 3 项是整数 1 至 3,接下来 4 项是整数 1 至 4,依次类推。
小蓝想知道,这个数列中,连续一段的和是多少。
输入描述
输入的第一行包含一个整数 T,表示询问的个数。
接下来 T 行,每行包含一组询问,其中第 i 行包含两个整数 li 和 ri,表示询问数列中第 li 个数到第 ri 个数的和。
输出描述
输出 T 行,每行包含一个整数表示对应询问的答案。
输入输出样例
示例
输入
3
1 1
1 3
5 8
输出
1
4
8
评测用例规模与约定
前缀和这个方法弯弯绕绕有点多:
#include<iostream>
#include<algorithm> //for lower_bound
using namespace std;typedef long long ll;const int N = 2e6+10;
ll a[N]; //a[i]:前i组所有元素的个数(第i组元素的和)
ll b[N]; //b[i]:前i组所有元素的和 int t;//计算数列中前x项的和
ll f(ll x)
{if(x==0) return 0;//pos:数列中第x项是第pos组 //-a:得到下标i int pos=lower_bound(a+1, a+1+N, x)-a;//前pos-1组的和 + 第pos组的前(x-a[pos-1])项的和//第pos组的前(x-a[pos-1])项的和 = 第i组元素的和return b[pos-1]+a[x-a[pos-1]];
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);for(ll i=1; i<N; ++i){a[i] = a[i-1]+i;b[i] = b[i-1]+a[i]; //第i组元素的和恰好等于前i组的元素个数 }cin>>t; while(t--){ll l, r;cin>>l>>r;cout<<f(r)-f(l-1)<<'\n';}return 0;
}