标签:线段树
转载请注明出处: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