这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHSK的博客,大神是山东省队队员,他的博客中的题的质量都比我高几个档次);

这是大神MagHSK的解释:因为10^9顶多开5~6次方就成了1了(当然这里的等于是向下取整的)因此对于修改操作,如果某一段不是1或不是0,就暴力修改,如果是1/0就不管他。修改完之后update一下就好了。

题目上说我们给出的是一个可修改(修改的规则就是对要修改的区间内每个数开平方)、可查询(就是求一段区间上所有数字的和)的一个数列。

显然我们直接暴力的效率是很低的,那么我们就采取了线段树——一种神奇的数据结构。

线段树作为可修改可查询的数据结构,基本操作就是点更新、区间更新和区间查询(包括最小值、最大值和区间和)这里因为是解题报告,所以就不跟大家讲基本思路了,直接进入正题,基本思路和代码板子请自己去看。

这里因为是对区间内的数开平方,所以区间更新就有点不大好用了(主要是没法直接标记区间然后开平方,这样会计算错误),然后数据范围也不算大,所以我们就考虑搜索线段树上的每一个在需要update(更新)的区间的所有点进行开方点更新,然后再push_up(往上面推,求出每个线段树上区间的和)上去。这样就可以完成更新任务了。(push_up和change(update)函数代码跟板子上不大一样,all数组就是标记这个区间内的数还值不值得进行开平方操作,显然如果这个区间内的和为1或者0的时候就不用开平方了,change的时候就可以省略了)。

区间查询的操作就是套板子,这个没什么需要思考的。

还是那句老话,要先考虑自己写,然后实在不会了再看题解,总是copy别人的代码自己的水平肯定上升得很慢。

废话不再说,上代码。

 #include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int INF = ;
int n;
LL sum[], A[];
bool all[];
void pu(int now) {
sum[now] = sum[now << ] + sum[now << | ];
all[now] = all[now << ] && all[now << | ];
}
void build(int now, int l, int r) {
if (l == r) {
sum[now] = A[l];
if (sum[now] == || sum[now] == )
all[now] = true;
return;
}
int mid = (l + r) >> ;
build(now << , l, mid);
build(now << | , mid + , r);
pu(now);
}
LL query(int now, int l, int r, int ll, int rr) {
if (ll <= l && r <= rr) {
return sum[now];
}
int mid = (l + r) >> ;
LL ret = ;
if (ll <= mid) ret += query(now << , l, mid, ll, rr);
if (rr > mid) ret += query(now << | , mid + , r, ll, rr);
return ret;
}
void change(int now, int l, int r, int ll, int rr) {
if (all[now]) {
return;
}
if (l == r) {
sum[now] = sqrt(sum[now]);
if (sum[now] == || sum[now] == )
all[now] = true;
return;
}
int mid = (l + r) >> ;
if (ll <= mid) change(now << , l, mid, ll, rr);
if (rr > mid) change(now << | , mid + , r, ll, rr);
pu(now);
}
int main() {
scanf("%d", &n);
for (int i = ; i <= n; ++i)
scanf("%lld", A+i);
build(, , n);
int m, x, y, z;
scanf("%d", &m);
while (m--) {
scanf("%d%d%d", &x, &y, &z);
if (y > z) swap(y, z);
if (x==) {
printf("%lld\n", query(, , n, y, z));
} else {
change(, , n, y, z);
}
}
return ;
}

这次解题报告就完结啦,蒟蒻一般是在每周的星期三晚和星期天晚发解题报告,大家就不要在其他时间翻我的博客啦。

习题: codevs 2492 上帝造题的七分钟2 解题报告的更多相关文章

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

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

  2. C++之路进阶——codevs2492(上帝造题的七分钟 2)

    2492 上帝造题的七分钟 2  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 大师 Master    题目描述 Description XLk觉得<上帝造题的七分钟&g ...

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

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

  4. 【BZOJ3211&3038】花神游历各国&上帝造题的七分钟2(CodeVS)

    Description   Input   Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 ...

  5. 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...

  6. BZOJ3132: 上帝造题的七分钟

    3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 483  Solved: 222[Submit][Status] Desc ...

  7. tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

    P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着 ...

  8. 「Poetize4」上帝造题的七分钟2

    描述 Description "第一分钟,X说,要有数列,于是便给定了一个正整数数列.第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作.第三分钟,k说,要能查询, ...

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

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

随机推荐

  1. How Google TestsSoftware - Crawl, walk, run.

    One of the key ways Google achievesgood results with fewer testers than many companies is that we ra ...

  2. 练习2 练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。

    package banking; public class Customer { private String firstName; private String lastName; private ...

  3. WPF Bitmap转Imagesource

    var imgsource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(),IntPtr ...

  4. maven -- 学习笔记(二)之setting.xml配置说明(备忘)

    setting.xml配置说明,learn from:http://pengqb.javaeye.com,http://blog.csdn.net/mypop/article/details/6146 ...

  5. Java多线程系列--“JUC集合”06之 ConcurrentSkipListSet

    概要 本章对Java.util.concurrent包中的ConcurrentSkipListSet类进行详细的介绍.内容包括:ConcurrentSkipListSet介绍ConcurrentSki ...

  6. 深度学习中的Data Augmentation方法(转)基于keras

    在深度学习中,当数据量不够大时候,常常采用下面4中方法: 1. 人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data Augm ...

  7. cnn笔记2

  8. Shiro —— Spring 环境下的使用

    一.使用 1.搭建基础环境 (1)导入 Spring 和 Shiro 的 Jar 包 正常导入 spring jar包 导入日志包 log4j-1.2.15.jar slf4j-api-1.6.1.j ...

  9. 利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境

    前后端分离这个词一点都不新鲜,完全的前后端分离在岗位协作方面,前端不写任何后台,后台不写任何页面,双方通过接口传递数据完成软件的各个功能实现.此种情况下,前后端的项目都独立开发和独立部署,在开发期间有 ...

  10. Js位置与大小(1)——正确理解和运用与尺寸大小相关的DOM属性

    在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大 ...