zoukankan      html  css  js  c++  java
  • Can you answer these queries?---hdu4027

    题目链接

    有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:
    ", 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
    ", ans);
                }
            }
            printf("
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    poj 1850/poj 1496
    poj 1035
    poj 3252
    hdoj 1013
    poj 2965
    poj 1844
    poj 2309
    蓝桥杯比赛回来后计划。。。
    山大实训第二周感想
    hadoop——Map/Reduce中combiner的使用
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4693360.html
Copyright © 2011-2022 走看看