Time Limit: 3 Sec Memory Limit: 128 MB

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

  1. 10
  2. 1 2 3 4 5 6 7 8 9 10
  3. 5
  4. 0 1 10
  5. 1 1 10
  6. 1 1 5
  7. 0 5 8
  8. 1 4 8

Sample Output

  1. 19
  2. 7
  3. 6

HINT

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

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

Solution

显然的,1e12的数可以在最多10次以内就可以被开为1,所以到了线段树一个区间,如果这个区间全是1,不管是询问还是修改都直接return回去。不然直接在线段树里面暴力修改。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<cstring>
  5. #define lowbit(x) ((x)&(-(x)))
  6. #define lc o<<1
  7. #define rc o<<1|1
  8. using namespace std;
  9. #define REP(i,a,n) for(register int i=(a);i<=(n);++i)
  10. #define PER(i,a,n) for(register int i=(a);i>=(n);--i)
  11. #define FEC(i,x) for(register int i=head[x];i;i=g[i].ne)
  12. template<typename A>inline void read(A&a){a=0;char c=0;int f=1;while(c<'0'||c>'9')(c=getchar())=='-'?f=-1:0;while(c>='0'&&c<='9')a=(a<<3)+(a<<1)+c-'0',c=getchar();f==-1?a=-a:0;}
  13. char buf[30];template<typename A>inline void write(A a){if(a<0)putchar('-'),a=-a;int top=0;if(!a)buf[top=1]='0';while(a)buf[++top]=a%10+'0',a/=10;while(top)putchar(buf[top--]);}
  14. typedef long long ll;typedef unsigned long long ull;
  15. template<typename A,typename B>inline bool SMAX(A&x,const B&y){return y>x?x=y,1:0;}
  16. template<typename A,typename B>inline bool SMIN(A&x,const B&y){return y<x?x=y,1:0;}
  17. const int N=100000+7;
  18. int n,Q,opt,x,y;ll a[N];//错误笔记:似乎a数组就要开ll了
  19. struct Node{ll maxv;}t[N<<2];
  20. inline void Build(int o,int L,int R){if(L==R)t[o].maxv=a[L];else{int M=(L+R)>>1;Build(lc,L,M);Build(rc,M+1,R);t[o].maxv=max(t[lc].maxv,t[rc].maxv);}}
  21. inline void Update(int o,int L,int R,int l,int r){
  22. if(t[o].maxv<=1)return;if(L==R)return (void)(t[o].maxv=sqrt(t[o].maxv));
  23. int M=(L+R)>>1;if(l<=M)Update(lc,L,M,l,r);if(r>M)Update(rc,M+1,R,l,r);
  24. t[o].maxv=max(t[lc].maxv,t[rc].maxv);
  25. }
  26. inline ll Sum(int o,int L,int R,int l,int r){
  27. if(t[o].maxv<=1)return (min(R,r)-max(L,l)+1)*t[o].maxv;if(L==R)return t[o].maxv;
  28. int M=(L+R)>>1;ll ans=0;if(l<=M)ans+=Sum(lc,L,M,l,r);if(r>M)ans+=Sum(rc,M+1,R,l,r);
  29. return ans;
  30. }
  31. int main(){
  32. read(n);for(register int i=1;i<=n;++i)read(a[i]);
  33. Build(1,1,n);read(Q);
  34. for(register int i=1;i<=Q;++i){
  35. read(opt),read(x),read(y);if(x>y)x^=y^=x^=y;
  36. if(opt)write(Sum(1,1,n,x,y)),putchar('\n');
  37. else Update(1,1,n,x,y);
  38. }
  39. }

BZOJ3038 上帝造题的七分钟的更多相关文章

  1. bzoj3211花神游历各国&&bzoj3038上帝造题的七分钟2*

    bzoj3211花神游历各国 题意: n个数的序列,m个操作,操作两种:区间开根(向下取整)和区间求和.n≤100000,m≤200000,序列中的数非负且≤109. 题解: 一个≤109的数开6次根 ...

  2. bzoj3038 上帝造题的七分钟2

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

  3. bzoj3038上帝造题的七分钟2

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

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

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

  5. Bzoj3038 上帝造题的七分钟2 并查集

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

  6. TYVJ 1941 BZOJ3038 上帝造题的七分钟2 并查集+树状数组

    背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段数中每个 ...

  7. [BZOJ3038]上帝造题的七分钟2 树状数组+并查集

    考试的时候用了两个树状数组去优化,暴力修改,树状数组维护修改后区间差值还有最终求和,最后骗了40分.. 这道题有好多种做法,求和好说,最主要的是开方.这道题过的关键就是掌握一点:在数据范围内,最多开方 ...

  8. 【线段树】bzoj3038 上帝造题的七分钟2 / bzoj3211 花神游历各国

    暴力修改,记录一段是否全部为1或0,若全是了,则不再修改. 注意3211一定要判是否为0,否则会T得惨无人道. #include<cstdio> #include<cmath> ...

  9. [BZOJ3211]花神游历各国&&[BZOJ3038] 上帝造题的七分钟2 树状数组+并查集

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 4057  Solved: 1480[Submit][Status][Discu ...

随机推荐

  1. android 6.0适配(总结)

    6.0的适配主要是权限: 权限的分组: 普通权限:也就是正常权限,是对手机的一些正常操作,对用户的隐私没有太大影响的权限,比如手机的震动,网络访问,蓝牙等权限,这些权限会在应用被安装的时候默认授予,用 ...

  2. shell学习记录----初识sed和gawk

    Linux命令行与shell脚本编程大全中关于sed和gawk的介绍合在一起,而且结构有点乱. 不像之前的命令写的很清楚.所以这次我需要写下来整理一下. 一.sed部分 1.1 sed命令格式如下: ...

  3. JavaScript中数组的操作方法总汇

    Array(数组)是JavaScript中最为常用的类型了.ECMAScript中的数组都是数据的有序列表.数组中可以保存任何类型的数据.数组的大小是可以动态调整的,既可以随着数据的添加自动增长以容纳 ...

  4. 如何配置报表服务器扩展部署(Reporting Services 配置)

    Reporting Services 支持扩展部署模式.该模式允许运行共享单个报表服务器数据库的多个报表服务器实例. 若要创建扩展部署,请使用安装程序和 Reporting Services 配置工具 ...

  5. 关于Calendar和Reminder(日历和提醒)编程指南

    Event Kit框架使你能访问用户的Calendar.app和Reminders.app信息.虽然这是两个不同的app,但是他们使用相同的框架处理数据.类似地,存储这些数据的数据库,被称为日历数据库 ...

  6. 使用 localstorage 写入浏览器并获取

    写入:以字符串的形式写入 localStorage.setItem('data', JSON.stringify(arr)); 获取: 注意:一定要使JSON.parse转为对象才能取出来,不然是空的 ...

  7. win2016

    slmgr /ipk CB7KF-BWN84-R7R2Y-793K2-8XDDG slmgr /skms kms.03k.org slmgr /ato

  8. delphi中的idhttpserver如何才能收到idhttp发送来的exe\rar文件呢

    http://zhidao.baidu.com/link?url=-q2oXqYCKBZ9OgFDEHAcQwQEY_NroHcqGvVfKW67X5sF9LdjAAB_HPXQo04VxStFVS7 ...

  9. Windows7下MongoDB的下载、安装与配置详解

    一.Windows7下的运行库问题 虽然这个问题属于个例,但我觉得也有必要拿出来说说,保不齐你新装的系统就存在运行库没更新或者没装全的问题.出现这样的问题其实挺恼人的,具体表现就是系统经常会弹出警示框 ...

  10. Bootstrap 学习笔记8 下拉菜单滚动监听

    代码部分: <nav class="navbar navbar-default"> <a href="#" class="navba ...