转载请注明出处:http://blog.csdn.net/u012860063
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027
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
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
//lson和rson分辨表示结点的左儿子和右儿子
//rt表示当前子树的根(root),也就是当前所在的结点
const __int64 maxn = 111111;
//maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍
__int64 sum[maxn<<2];
void PushUp(int rt) //把当前结点的信息更新到父结点
{
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void build(int l,int r,int rt)
{
if (l == r)
{
scanf("%I64d",&sum[rt]);
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
PushUp(rt);
}
void update(int L,int R,int l,int r,int rt)
{
if(l == r)
{
sum[rt]=sqrt(sum[rt]);
return ;
}
int m = (l + r) >> 1;
if (L <= m)
update(L , R , lson);
if (m < R)
update(L , R , rson);
PushUp(rt);
}
__int64 query(int L,int R,int l,int r,int rt)
{
if (L <= l && r <= R)
{
return sum[rt];
}
int m = (l + r) >> 1;
__int64 ret = 0;
if (L <= m)
ret += query(L , R , lson);
if (m < R)
ret += query(L , R , rson);
return ret;
}
int main()
{
int N , Q ,T , K=0;
int a , b , c;
while(~scanf("%d",&N) && N)
{
build(1 , N , 1);//建树
printf("Case #%d:\n",++K);
scanf("%d",&Q);
while (Q--)//Q为询问次数
{
// char op[2];
int op;
int a , b , c;
scanf("%d%d%d",&op,&a,&b);
if(a > b)
{
int t;
t = a, a = b, b = t;
}
if (op == 1)
{
printf("%I64d\n",query(a , b , 1 , N , 1));
}
else
{
if(query(a , b , 1 , N , 1) != b-a+1)
update(a , b , 1 , N , 1);
}
}
printf("\n");
}
return 0;
}hdu4027 Can you answer these queries?(线段树平方减少,区间求和),布布扣,bubuko.com
hdu4027 Can you answer these queries?(线段树平方减少,区间求和)
原文:http://blog.csdn.net/u012860063/article/details/35788095