您的位置:首页 > 产品设计 > UI/UE

hdu 4027 Can you answer these queries?

2013-08-29 23:26 351 查看
        hdu 4027 Can you answer these queries?

        线段树

#include <stdio.h>
#include <string.h>
#include <math.h>

#define MAX 400000

struct node {
int left, right;
__int64 val;
int flag;
};

node tree[MAX];

void buildTree(int l, int r, int n) {
tree
.left = l;
tree
.right = r;
tree
.flag = 0;

if (l == r) {
scanf("%I64d", &tree
.val);

if (tree
.val <= 1) {
tree
.flag = 1;
}

return ;
}

int mid = (l + r)>>1;
buildTree(l, mid, n<<1);
buildTree(mid + 1, r, n<<1|1);
tree
.val = tree[n<<1].val + tree[n<<1|1].val;
if (tree[n<<1].flag && tree[n<<1|1].flag) {
tree
.flag = 1;
}
}

void update(int l, int r, int n) {

if (tree
.flag) {
return ;
}

if (tree
.left == tree
.right) {
tree
.val = (__int64)sqrt(1.0*tree
.val);
if (tree
.val <= 1) {
tree
.flag = 1;
}
return ;
}

int mid = (tree
.left + tree
.right)>>1;
if (r <= mid) {
update(l, r, n<<1);
} else if (l > mid) {
update(l, r, n<<1|1);
} else {
update(l, mid, n<<1);
update(mid + 1, r, n<<1|1);
}

tree
.val = tree[n<<1].val + tree[n<<1|1].val;
if (tree[n<<1].flag && tree[n<<1|1].flag) {
tree
.flag = 1;
}
}

__int64 query(int l, int r, int n) {
__int64 ans = 0;

if (tree
.left == l && tree
.right == r) {
return tree
.val;
}

int mid = (tree
.left + tree
.right)>>1;
if (r <= mid) {
ans += query(l, r, n<<1);
} else if (l > mid) {
ans += query(l, r, n<<1|1);
} else {
ans += query(l, mid, n<<1);
ans += query(mid + 1, r, n<<1|1);
}

return ans;
}

int main() {
int n, m, t = 0;
int a, b, c;
int min, max;
int i;

while (scanf("%d", &n) == 1) {
memset(tree, 0, sizeof(tree));
printf("Case #%d:\n", ++t);
buildTree(1, n, 1);

scanf("%d", &m);
for (i = 0; i < m; i++) {
scanf("%d%d%d", &a, &b, &c);
min = b > c ? c : b;
max = b > c ? b : c;

if (!a) {
update(min, max, 1);
} else {
printf("%I64d\n", query(min, max, 1));
}
}

printf("\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线段树