zoukankan      html  css  js  c++  java
  • B3038 上帝造题的七分钟2 线段树

    这就是一道变得比较奇怪的线段树,维护每个区间的最大值和区间和,然后关键在于每次取根号的话数值下降的特别快,不用几次就都是1了,所以每次暴力单点修改,然后直接找区间最大值,假如区间最大值是1的话,就直接返回就行了。

    具体看代码就行了。

    题干:

    XLk觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。
    "第一分钟,X说,要有数列,于是便给定了一个正整数数列。
    第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作。
    第三分钟,k说,要能查询,于是便有了求一段数的和的操作。
    第四分钟,彩虹喵说,要是noip难度,于是便有了数据范围。
    第五分钟,诗人说,要有韵律,于是便有了时间限制和内存限制。
    第六分钟,和雪说,要省点事,于是便有了保证运算过程中及最终结果均不超过64位有符号整数类型的表示范围的限制。
    第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。"
    ——《上帝造题的七分钟·第二部》
    所以这个神圣的任务就交给你了。
    
    输入格式
    第一行一个整数n,代表数列中数的个数。
    第二行n个正整数,表示初始状态下数列中的数。
    第三行一个整数m,表示有m次操作。
    接下来m行每行三个整数k,l,r,k=0表示给[l,r]中的每个数开平方(下取整),k=1表示询问[l,r]中各个数的和。
    
    输出格式
    对于询问操作,每行输出一个回答。
    
    样例输入
    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
    样例输出
    19
    7
    6
    提示
    1:对于100%的数据,1<=n<=1000001<=l<=r<=n,数列中的数大于0,且不超过1e12。
    
    2:数据不保证L<=R 若L>R,请自行交换L,R,谢谢!

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<ctime>
    #include<queue>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define duke(i,a,n) for(int i = a;i <= n;i++)
    #define lv(i,a,n) for(int i = a;i >= n;i--)
    #define clean(a) memset(a,0,sizeof(a))
    const int INF = 1 << 30;
    typedef long long ll;
    typedef double db;
    template <class T>
    void read(T &x)
    {
        char c;
        bool op = 0;
        while(c = getchar(), c < '0' || c > '9')
            if(c == '-') op = 1;
        x = c - '0';
        while(c = getchar(), c >= '0' && c <= '9')
            x = x * 10 + c - '0';
        if(op) x = -x;
    }
    template <class T>
    void write(T x)
    {
        if(x < 0) putchar('-'), x = -x;
        if(x >= 10) write(x / 10);
        putchar('0' + x % 10);
    }
    ll tree[400010];
    ll sum[400010];
    ll a[100010];
    int n;
    void build(int o,int l,int r)
    {
        if(l == r)
        {
            tree[o] = a[l];
            sum[o] = a[l];
            return;
        }
        int mid = (l + r) >> 1;
        build(o << 1,l,mid);
        build(o << 1 | 1,mid + 1,r);
        tree[o] = max(tree[o << 1],tree[o << 1 | 1]);
        sum[o] = (sum[o << 1] + sum[o << 1 | 1]);
    }
    void update(int o,int x,int y,int l,int r)
    {
        int mid = (x + y) >> 1;
        if(x == y)
        {
            sum[o] = sqrt(sum[o]);
            tree[o] = sqrt(tree[o]);
            return;
        }
        else
        {
            if(mid >= r)
            {
                if(tree[o << 1] > 1)
                update(o << 1,x,mid,l,r);
            }
            else if(mid < l)
            {
                if(tree[o << 1 | 1] > 1)
                update(o << 1 | 1,mid + 1,y,l,r);
            }
            else
            {
                if(tree[o << 1] > 1)
                update(o << 1,x,mid,l,mid);
                if(tree[o << 1 | 1] > 1)
                update(o << 1 | 1,mid + 1,y,mid + 1,r);
            }
            sum[o] = sum[o << 1] + sum[o << 1 | 1];
            tree[o] = max(tree[o << 1],tree[o << 1 | 1]);
        }
    }
    ll query(int o,int x,int y,int l,int r)
    {
        int mid = (x + y) >> 1;
        if(l == x && r == y)
        {
            return sum[o];
        }
        if(mid >= r)
        {
            return query(o << 1,x,mid,l,r);
        }
        else if(mid < l)
        {
            return query(o << 1 | 1,mid + 1,y,l,r);
        }
        else
        {
            return query(o << 1,x,mid,l,mid) + query(o << 1 | 1,mid + 1,y,mid + 1,r);
        }
    }
    int main()
    {
        read(n);
        duke(i,1,n)
        {
            read(a[i]);
        }
        build(1,1,n);
        int m;
        read(m);
        duke(i,1,m)
        {
            int l,r,opt;
            read(opt);read(l);read(r);
            if(l > r)
            swap(l,r);
            if(opt == 0)
            {
                update(1,1,n,l,r);
            }
            else
            {
                printf("%lld
    ",query(1,1,n,l,r));
            }
        }
    }
  • 相关阅读:
    (转) dedecms中自定义数据模型
    (转)dedecms网页模板编写
    (转)dedecms入门
    (转)浅谈dedecms模板引擎工作原理及自定义标签
    (转)PHP数组的总结(很全面啊)
    (转)echo和print的区别
    (转)dedecms代码详解 很全面
    (转)php 函数名称前的@有什么作用
    (转)PHP正则表达式的快速学习方法
    GIS中mybatis_CMEU的配置方法
  • 原文地址:https://www.cnblogs.com/DukeLv/p/9670860.html
Copyright © 2011-2022 走看看