传送门

Luogu

解题思路

区间开方以及区间求和。

考虑用线段树来做。

开方操作看似没有任何结合律可言,但这题有另外一个性质:

一个数的初始值不超过 \(10^{18}\) ,而这个数被开方6次左右就可以到1或0,并且1和0都是不需要再开方的。

所以我们记一下每个节点代表区间的最大值,若该值小于等于1,那么就不需要再进入下一层递归,否则就向下递归修改,修改次数最坏也不过是 \(O(6n)\) 左右,线段树完全没压力,于是这题就做完了。

细节注意事项

  • 咕咕咕

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= (c == '-'), c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
} typedef long long LL;
const int _ = 100010; int n; LL a[_], sum[_ << 2], mx[_ << 2]; inline int lc(int rt) { return rt << 1; } inline int rc(int rt) { return rt << 1 | 1; } inline void pushup(int rt) {
sum[rt] = sum[lc(rt)] + sum[rc(rt)];
mx[rt] = max(mx[lc(rt)], mx[rc(rt)]);
} inline void build(int rt = 1, int l = 1, int r = n) {
if (l == r) { mx[rt] = sum[rt] = a[l]; return; }
int mid = (l + r) >> 1;
build(lc(rt), l, mid), build(rc(rt), mid + 1, r), pushup(rt);
} inline void update(int ql, int qr, int rt = 1, int l = 1, int r = n) {
if (mx[rt] <= 1) return;
if (l == r) { mx[rt] = sum[rt] = sqrt(sum[rt]); return; }
int mid = (l + r) >> 1;
if (ql <= mid) update(ql, qr, lc(rt), l, mid);
if (qr > mid) update(ql, qr, rc(rt), mid + 1, r);
pushup(rt);
} inline LL query(int ql, int qr, int rt = 1, int l = 1, int r = n) {
if (ql <= l && r <= qr) return sum[rt];
int mid = (l + r) >> 1; LL res = 0;
if (ql <= mid) res += query(ql, qr, lc(rt), l, mid);
if (qr > mid) res += query(ql, qr, rc(rt), mid + 1, r);
return res;
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
int Case = 0;
while (scanf("%d", &n) != EOF) {
printf("Case #%d:\n", ++Case);
for (rg int i = 1; i <= n; ++i) read(a[i]);
build();
int q; read(q);
for (rg int f, ql, qr; q--; ) {
read(f), read(ql), read(qr);
if (ql > qr) swap(ql, qr);
if (!f) update(ql, qr);
else printf("%lld\n", query(ql, qr));
}
puts("");
}
return 0;
}

完结撒花 \(qwq\)

最新文章

  1. PHP uniqid 高并发生成不重复唯一ID
  2. mysql乐观锁总结和实践--转
  3. Linux 服务器IO模型 epoll
  4. 13个JavaScript图表(JS图表)图形绘制插件【转】
  5. 数据结构(DataStructure)与算法(Algorithm)、STL应用
  6. POJ 2739 Sum of Consecutive Prime Numbers(尺取法)
  7. HP XP7 GAD双活实现的理解
  8. iOS:核心动画之动画组CAAnimationGroup
  9. JavaScript字符串分割方法
  10. asp.net判断访问者是否来自移动端
  11. MySQL存储过程详解 mysql 存储过程
  12. if条件语句练习(相亲)
  13. 在Ubuntu 11.10工具栏上用数字显示网速、CPU负荷和内存占用量『译』
  14. JAVA核心技术I---JAVA基础知识(数字相关类)
  15. HashMap和LinkedHashMap区别
  16. 3、pandas的loc和iloc数据筛选
  17. Maven包查询库
  18. Oracle Apps DBA R12.2 Syllabus
  19. ZeroMQ API(四) 套接字
  20. caffe+win7+vs2013 仅CPU环境安装

热门文章

  1. map或者对象转换
  2. 十八、sun JPA理解及使用
  3. [运维] 请求 nginx 出现 502 Bad Gateway 的解决方案!
  4. Java连载66-数组的两种初始化方式
  5. where、having区别
  6. spark实验(二)--scala安装(1)
  7. string和 new string的区别
  8. postgres语句
  9. Css——设置input输入框光标颜色
  10. java并发初探ConcurrentSkipListMap