10 1 2 3 4 5 6 7 8 9 10 5 0 1 10 1 1 10 1 1 5 0 5 8 1 4 8
Case #1: 19 7 6
修改+查询,很明显的线段树题,此题特殊在要对数进行开方,而一个小于2^63的数,最多开6次平方根就变成1,因此我们可以通过判断线段树节点累加值和区间长度比较来判断某个区间是否需要更新,如果要更新,则必须要到叶子节点才能更新
/************************************************************************* > File Name: seg_6.cpp > Author: ALex > Mail: [email protected] > Created Time: 2015年01月09日 星期五 16时02分06秒 ************************************************************************/ #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 100010; int data[N][7]; struct node { int l, r; long long sum; }tree[N << 2]; void build (int p, int l, int r) { tree[p].l = l; tree[p].r = r; if (l == r) { scanf("%lld", &tree[p].sum); return; } int mid = (l + r) >> 1; build (p << 1, l, mid); build (p << 1 | 1, mid + 1, r); tree[p].sum = tree[p << 1].sum + tree[p << 1 | 1].sum; } void update (int p, int l, int r) { if (tree[p].sum == tree[p].r - tree[p].l + 1) { return; } if (tree[p].l == tree[p].r) { tree[p].sum = (long long)(sqrt(tree[p].sum * 1.0)); return; } int mid = (tree[p].l + tree[p].r) >> 1; if (r <= mid) { update (p << 1, l, r); } else if (l > mid) { update (p << 1 | 1, l, r); } else { update (p << 1, l, mid); update (p << 1 | 1, mid + 1, r); } tree[p].sum = tree[p << 1].sum + tree[p << 1 | 1].sum; } long long query (int p, int l, int r) { if (tree[p].l >= l && tree[p].r <= r) { return tree[p].sum; } int mid = (tree[p].l + tree[p].r) >> 1; if (r <= mid) { return query (p << 1, l, r); } else if (l > mid) { return query (p << 1 | 1, l, r); } else { return query (p << 1, l, mid) + query (p << 1 | 1, mid + 1, r); } } int main () { int n, m; int icase = 1; while (~scanf ("%d", &n)) { int op, x, y; build (1, 1, n); scanf("%d", &m); printf("Case #%d:\n", icase++); while (m--) { scanf("%d%d%d", &op, &x, &y); if(x > y) { swap(x, y); } if (op) { printf("%lld\n", query(1, x, y)); } else { update (1, x, y); } } printf("\n"); } return 0; }