标签:
有n个数:当操作为1时求L到R的和;
当操作为0时更新L到R为原来的平方根;
不过如果仔细演算的话会发现一个2^64数的平方根开8次也就变成了 1,所以也更新不了多少次,所以可以每次更新到底。、
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> #define INF 0xfffffff #define N 100010 using namespace std; #define Lson r<<1 #define Rson r<<1|1 struct SegTree { int L, R; long long sum; int mid() { return (L+R)>>1; } int len() { return R-L+1; } }a[N*4]; void Update(int r, int L, int R) { if(a[r].len()==a[r].sum) return ; if(a[r].L == a[r].R)//到达叶子节点; { a[r].sum = (long long)sqrt(a[r].sum); return ; } if(R<=a[r].mid()) Update(Lson, L, R); else if(L > a[r].mid()) Update(Rson, L, R); else { Update(Lson, L, a[r].mid()); Update(Rson, a[r].mid()+1, R); } a[r].sum = a[Rson].sum + a[Lson].sum; } void BuildSegTree(int r, int L, int R) { a[r].L = L, a[r].R = R; if(L == R) { scanf("%I64d", &a[r].sum); return; } BuildSegTree(Lson, L, a[r].mid()); BuildSegTree(Rson, a[r].mid()+1, R); a[r].sum = a[Rson].sum + a[Lson].sum; } long long Query(int r, int L, int R) { if(a[r].L == L && a[r].R == R) { return a[r].sum; } if(L>a[r].mid()) return Query(Rson, L ,R); else if(R <= a[r].mid()) return Query(Lson, L, R); else { long long ans1 = Query(Lson, L, a[r].mid()); long long ans2 = Query(Rson, a[r].mid()+1, R); return ans1 + ans2; } } int main() { int n, m, L, R, op, t=1; while(scanf("%d", &n) != EOF) { BuildSegTree(1, 1, n); scanf("%d", &m); printf("Case #%d:\n", t++); while(m--) { scanf("%d%d%d", &op, &L, &R); if(L>R)swap(L, R);//L和R的大小没说; if(op==0) Update(1, L, R); else { long long ans=Query(1, L, R); printf("%I64d\n", ans); } } printf("\n"); } return 0; }
Can you answer these queries?---hdu4027
标签:
原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4693360.html