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

    时间限制: 1 s
    空间限制: 64000 KB
    题目等级 : 大师 Master
    题目描述 Description
      XLk觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。
      “第一分钟,X说,要有数列,于是便给定了一个正整数数列。
      第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作。
      第三分钟,k说,要能查询,于是便有了求一段数的和的操作。
      第四分钟,彩虹喵说,要是noip难度,于是便有了数据范围。
      第五分钟,诗人说,要有韵律,于是便有了时间限制和内存限制。
      第六分钟,和雪说,要省点事,于是便有了保证运算过程中及最终结果均不超过64位有符号整数类型的表示范围的限制。
      第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。”
      ——《上帝造题的七分钟·第二部》
      所以这个神圣的任务就交给你了。
    输入描述 Input Description
      第一行一个整数n,代表数列中数的个数。
      第二行n个正整数,表示初始状态下数列中的数。
      第三行一个整数m,表示有m次操作。
      接下来m行每行三个整数k,l,r,k=0表示给[l,r]中的每个数开平方(下取整),k=1表示询问[l,r]中各个数的和。
      UPD:注意数据中有可能l>r,所以遇到这种情况请交换l和r。
    输出描述 Output Description
      对于询问操作,每行输出一个回答。
    样例输入 Sample Input
    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
    样例输出 Sample Output
    19
    7
    6
    数据范围及提示 Data Size & Hint
      对于30%的数据,1<=n,m<=1000,数列中的数不超过32767。
      对于100%的数据,1<=n,m<=100000,1<=l,r<=n,数列中的数大于0,且不超过1e12。
      注意l有可能大于r,遇到这种情况请交换l,r。
    来源:Nescafe 20
    分类标签 Tags
    并查集 树状数组 线段树 树结构

    /*
    线段树暴力.
    每次都扫到叶节点.
    嗯这样当然过不了.
    需要加一点小优化.
    我们知道一个数多次取sqrt会变成1.
    那么此时再次取sqrt是没贡献的.
    我们就把他们记下来做一个tag
    表示这个区间能不能再次修改.
    这样也是很慢的毕竟是暴力嘛. 
    */
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #define MAXN 100001
    #define LL long long
    using namespace std;
    int n,m,cut;
    struct data{int l,r,lc,rc;bool bj;LL x;}tree[MAXN*4];
    LL read()
    {
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void build(int l,int r)
    {
        int k=++cut;
        tree[k].l=l,tree[k].r=r;
        if(l==r) {tree[k].x=read();return ;}
        int mid=(l+r)>>1;
        tree[k].lc=cut+1;build(l,mid);
        tree[k].rc=cut+1;build(mid+1,r);
        tree[k].x=tree[tree[k].lc].x+tree[tree[k].rc].x;
        return ;
    }
    LL query(int k,int l,int r)
    {
        if(l<=tree[k].l&&tree[k].r<=r) return tree[k].x;
        int mid=(tree[k].l+tree[k].r)>>1;
        LL tot=0;
        if(l<=mid) tot+=query(tree[k].lc,l,r);
        if(r>mid) tot+=query(tree[k].rc,l,r);
        return tot;
    }
    void change(int k,int l,int r)
    {
        if(tree[k].bj) return ;
        if(tree[k].l==tree[k].r)
        {
            if(tree[k].x!=1)tree[k].x=sqrt(tree[k].x);
            if(tree[k].x==1) tree[k].bj=true;
            return ;
        }
        int mid=(tree[k].l+tree[k].r)>>1;
        if(l<=mid) change(tree[k].lc,l,r);
        if(r>mid) change(tree[k].rc,l,r);
        tree[k].x=tree[tree[k].lc].x+tree[tree[k].rc].x;
        tree[k].bj=tree[tree[k].lc].bj&tree[tree[k].rc].bj;
        return ;
    }
    int main()
    {
        int x,y,z;
        n=read();
        build(1,n);
        m=read();
        while(m--)
        {
            z=read();x=read(),y=read();
            if(x>y) swap(x,y);
            if(!z) change(1,x,y);
            else printf("%lld
    ",query(1,x,y));
        }
        return 0;
    }
  • 相关阅读:
    noi 2011 noi嘉年华 动态规划
    最小乘积生成树
    noi 2009 二叉查找树 动态规划
    noi 2010 超级钢琴 划分树
    noi 2011 阿狸的打字机 AC自动机
    noi 2009 变换序列 贪心
    poj 3659 Cell Phone Network 动态规划
    noi 2010 航空管制 贪心
    IDEA14下配置SVN
    在SpringMVC框架下建立Web项目时web.xml到底该写些什么呢?
  • 原文地址:https://www.cnblogs.com/nancheng58/p/10068116.html
Copyright © 2011-2022 走看看