码迷,mamicode.com
首页 > 其他好文 > 详细

Can you answer these queries?---hdu4027

时间:2015-07-31 23:25:41      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

题目链接

有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;
}
View Code

 

Can you answer these queries?---hdu4027

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4693360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!