3038: 上帝造题的七分钟2

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 1469  Solved: 631
[Submit][Status][Discuss]

Description

XLk觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。
"第一分钟,X说,要有数列,于是便给定了一个正整数数列。
第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作。
第三分钟,k说,要能查询,于是便有了求一段数的和的操作。
第四分钟,彩虹喵说,要是noip难度,于是便有了数据范围。
第五分钟,诗人说,要有韵律,于是便有了时间限制和内存限制。
第六分钟,和雪说,要省点事,于是便有了保证运算过程中及最终结果均不超过64位有符号整数类型的表示范围的限制。
第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。"
——《上帝造题的七分钟·第二部》
所以这个神圣的任务就交给你了。

Input

第一行一个整数n,代表数列中数的个数。
第二行n个正整数,表示初始状态下数列中的数。
第三行一个整数m,表示有m次操作。
接下来m行每行三个整数k,l,r,k=0表示给[l,r]中的每个数开平方(下取整),k=1表示询问[l,r]中各个数的和。

Output

对于询问操作,每行输出一个回答。

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

HINT

1:对于100%的数据,1<=n<=100000,1<=l<=r<=n,数列中的数大于0,且不超过1e12。

2:数据不保证L<=R 若L>R,请自行交换L,R,谢谢!

Source

Poetize4

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3038

分析:开方操作的标记是不能合并的,怎么办呢

每个数最大都是1e12,开一次方成了1e6,然后1e3…可以看出来下降的十分迅速,当它到1或者0的时候再开方就没意义了…

所以线段树记录最大值,每次递归左右儿子时若最大值大于1则递归,每次修改区间暴力修改,没几次这个线段树就基本不递归了…

下面给出AC代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. inline ll read()
  5. {
  6. ll x=,f=;
  7. char ch=getchar();
  8. while(ch<''||ch>'')
  9. {
  10. if(ch=='-')
  11. f=-;
  12. ch=getchar();
  13. }
  14. while(ch>=''&&ch<='')
  15. {
  16. x=x*+ch-'';
  17. ch=getchar();
  18. }
  19. return x*f;
  20. }
  21. const ll N=;
  22. ll a[N];
  23. struct data
  24. {
  25. ll L,R;
  26. ll sum;
  27. bool flag;
  28. }tree[N<<];
  29. ll n,m;
  30. inline void buildtree(ll l,ll r,ll pos)
  31. {
  32. tree[pos].L=l;
  33. tree[pos].R=r;
  34. if(l==r)
  35. {
  36. tree[pos].sum=a[l];
  37. if(a[l]==||a[l]==)
  38. tree[pos].flag=;
  39. return;
  40. }
  41. ll mid=(l+r)/;
  42. buildtree(l,mid,pos*);
  43. buildtree(mid+,r,pos*+);
  44. tree[pos].sum=tree[pos*].sum+tree[pos*+].sum;
  45. tree[pos].flag=tree[pos*].flag&tree[pos*+].flag;
  46. }
  47. inline void update(ll l,ll r,ll pos)
  48. {
  49. if(tree[pos].flag)
  50. return;
  51. if(tree[pos].L==tree[pos].R)
  52. {
  53. tree[pos].sum=(ll)sqrt(tree[pos].sum);
  54. if(tree[pos].sum==||tree[pos].sum==)
  55. tree[pos].flag=;
  56. return;
  57. }
  58. ll mid=(tree[pos].L+tree[pos].R)/;
  59. if(mid>=r)
  60. update(l,r,pos*);
  61. else if(mid<l)
  62. update(l,r,pos*+);
  63. else
  64. {
  65. update(l,mid,pos*);
  66. update(mid+,r,pos*+);
  67. }
  68. tree[pos].sum=tree[pos*].sum+tree[pos*+].sum;
  69. tree[pos].flag=tree[pos*].flag&tree[pos*+].flag;
  70. }
  71. inline ll Query(ll l,ll r,ll pos)
  72. {
  73. if(tree[pos].L==l&&tree[pos].R==r)
  74. return tree[pos].sum;
  75. ll mid=(tree[pos].L+tree[pos].R)/;
  76. if(mid>=r)
  77. return Query(l,r,pos*);
  78. else if(mid<l)
  79. return Query(l,r,pos*+);
  80. else
  81. return Query(l,mid,pos*)+Query(mid+,r,pos*+);
  82. }
  83. int main()
  84. {
  85. n=read();
  86. for(ll i=;i<=n;i++)
  87. a[i]=read();
  88. buildtree(,n,);
  89. m=read();
  90. for(ll i=;i<=m;i++)
  91. {
  92. ll pos,l,r;
  93. pos=read();
  94. l=read();
  95. r=read();
  96. if(l>r)
  97. swap(l,r);
  98. if(!pos)
  99. update(l,r,);
  100. else
  101. printf("%lld\n",Query(l,r,));
  102. }
  103. return ;
  104. }

BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】的更多相关文章

  1. bzoj 3038: 上帝造题的七分钟2 线段树||hdu 4027

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 476[Submit][Status][Dis ...

  2. BZOJ_3038_上帝造题的七分钟2_线段树

    BZOJ_3038_上帝造题的七分钟2_线段树 题意: XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分 ...

  3. BZOJ 3038: 上帝造题的七分钟2

    3038: 上帝造题的七分钟2 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分 ...

  4. BZOJ 3038: 上帝造题的七分钟2 / BZOJ 3211: 花神游历各国 (线段树区间开平方)

    题意 给出一些数,有两种操作.(1)将区间内每一个数开方(2)查询每一段区间的和 分析 普通的线段树保留修改+开方优化.可以知道当一个数为0或1时,无论开方几次,答案仍然相同.所以设置flag=1变表 ...

  5. Bzoj3038 上帝造题的七分钟2 线段树

    Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1135  Solved: 509 Description XLk觉得<上帝造题的七分钟>不太 ...

  6. B3038 上帝造题的七分钟2 线段树

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

  7. Codevs 2492 上帝造题的七分钟 2(线段树)

    时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. " ...

  8. BZOJ 3038 上帝造题的七分钟2 (并查集+树状数组)

    题解:同 BZOJ 3211 花神游历各国,需要注意的是需要开long long,还有左右节点需要注意一下. #include <cstdio> #include <cmath> ...

  9. BZOJ 3038 上帝造题的七分钟2 树状数组+并查集

    题目大意:一个序列,有两种操作.1.将一段数中的每个数开根号.2.查询一段数的和. 思路:和3211是一个题,有兴趣的能够看看我的那篇博客. CODE: #include <cmath> ...

随机推荐

  1. ES6之Symbol

    ES6中Symbol是为了防止属性名冲突而引入的,是独一无二的.Symbol值是通过Symbol函数生成.Symbol值不能与其他类型的值运算否则会报错且Symbol的值可以转换为字符串或者是布尔值但 ...

  2. cocoapods安装说明,最快安装,以及使用

    安装卸载更新新推荐 文章最后 其他问题总结: 1 添加taobao提供的镜像地址:http://ruby.taobao.org/ 移除命令:gem sources --remove https://r ...

  3. Python Web框架

    本节对Python Web框架学习 一.MTVModel: 存放所有数据库相关文件Template:模板文件,存放html文件View: 业务处理,即函数文件 二.MVCmodel: 存放数据库相关文 ...

  4. VS源码编译QuaZip(Windows下)

    最近写个Qt demo,想要使用压缩和解压多个文件的功能,并不使用额外进程.网上参考了很多资料,发现只有QuaZip比较适合我的需求.但是QuaZip只提供源码,因此需要自己来编译. QuaZip简介 ...

  5. ASP.NET MVC下自定义错误页和展示错误页的几种方式

    在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...

  6. node学习心得

    此次学习主要使用的是基于nodejs平台的web应用开发框架. 一.express的工程结构 1.bin/www:express的执行入口,存放可执行文件: 2.node_modules:存放pack ...

  7. 冲顶大会APP技术选型及架构设计

    我在1月4日看到虎嗅推送"王思聪撒币"的消息,然后开始推敲背后技术.其中涉及直播流.实时弹幕.OAuth2.0开放授权.SMS api.Push网关.支付接口等业务,其技术实现并不 ...

  8. haslayout知多少

    我们都知道浏览器有bug,而IE的bug似乎比大多数浏览器都多.IE的表现与其他浏览器不同的原因之一就是,显示引擎使用一个称为布局(layout)的内部概念.   因为布局是专门针对显示引擎内部工作方 ...

  9. [HNOI2008]Cards

    题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案. 进一步,小春要求染出Sr张红色,Sb张蓝 ...

  10. 使用 BeanUtils 报错解决记录

    在使用BeanUtils.populate方法时,报错如下: java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHa ...