https://vjudge.net/problem/HDU-4027
题意:给一个数组序列, 数组长度为100000,现在有两种操作,
一种操作是将某一个固定区间所有数开方(向下取整),
另一种操作是询问某个区间的所有数字之和。
题意:给一个数组序列, 数组长度为100000,现在有两种操作,
一种操作是将某一个固定区间所有数开方(向下取整),
另一种操作是询问某个区间的所有数字之和。
思路: 当sum[rt] = r-l+1的时候就不需要往下递归了, 其他时候照常
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <sstream>
#include <map>
#include <set>
#define pi acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define inf 0x3f3f3f3f
#define INF 1e18
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef pair<int, int> P;
const double eps = 1e-10;
const int maxn = 1e5 + 5;
const int N = 1e4 + 5;
const int mod = 1e8;
LL sum[maxn<<2];
void Build(int l, int r, int rt)
{
if (l == r){
scanf("%I64d", &sum[rt]);
return;
}
int mid = (l + r) >> 1;
Build(lson);
Build(rson);
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
LL Query(int L, int R, int l, int r, int rt)
{
if (L<=l && r<=R)
return sum[rt];
int mid = (l + r) >> 1;
LL res = 0;
if (L <= mid) res += Query(L, R, lson);
if (R > mid) res += Query(L, R, rson);
return res;
}
void Update(int L, int R, int l, int r, int rt)
{
if (L<=l && r<=R && sum[rt] == r-l+1){
return;
}
if (l == r){
sum[rt] = sqrt(sum[rt]);
return ;
}
int mid = (l + r) >> 1;
if (L <= mid) Update(L, R, lson);
if (R > mid) Update(L, R, rson);
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
int main(void)
{
// freopen("in.txt", "r", stdin);
int n, m, cas = 1;
while (cin >> n){
Build(1, n, 1);
cin >> m;
printf("Case #%d:\n", cas++);
for (int i = 1; i <= m; i++){
int T, l, r;
cin >> T >> l >> r;
int a = min(l, r);
int b = max(l, r);
if (T == 0){
Update(a, b, 1, n, 1);
}
else {
cout << Query(a, b, 1, n, 1) << endl;
}
}
cout << endl;
}
return 0;
}