题意是:给出一个数组,之后给出l,r然你输出下标l和r之间所有数的和
开始想到暴力了,但是看到n最大为10的5次方,想到会超时吧
然后想到了树状数组,但是只是知道有这个概念,并不知道怎么实现
然后就看了别人的代码,发现暴力完全可以
理由是只需排序O(nlogn)算法,而log(10^5)是很小的。。。
思维固化就跪了
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 100100
using namespace std;
int a[MAXN];
__int64 b[MAXN], c[MAXN];//这里的 __int64用vim编译无法通过,但是交题可以A
int main(void) {
int n, m, t, l, r;
scanf("%d", &n);
for(int i=1; i<=n; ++i)
scanf("%d", &a[i]);
for(int i=1; i<=n; ++i)
b[i] = b[i-1]+a[i];
sort(a+1, a+1+n);
for(int i=1; i<=n; ++i)
c[i] = c[i-1]+a[i];
scanf("%d", &m);
while(m--) {
scanf("%d%d%d", &t, &l, &r);
if(t == 1)
cout << b[r]-b[l-1] << endl;
else cout << c[r]-c[l-1] << endl;
}
return 0;
}