习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇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 解题报告的更多相关文章
- Codevs 2492 上帝造题的七分钟 2(线段树)
时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. " ...
- C++之路进阶——codevs2492(上帝造题的七分钟 2)
2492 上帝造题的七分钟 2 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description XLk觉得<上帝造题的七分钟&g ...
- codevs2492 上帝造题的七分钟 2
2492 上帝造题的七分钟 2 题目描述 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列 ...
- 【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 ...
- 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...
- BZOJ3132: 上帝造题的七分钟
3132: 上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 483 Solved: 222[Submit][Status] Desc ...
- tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
P1716 - 上帝造题的七分钟 From Riatre Normal (OI)总时限:50s 内存限制:128MB 代码长度限制:64KB 背景 Background 裸体就意味着 ...
- 「Poetize4」上帝造题的七分钟2
描述 Description "第一分钟,X说,要有数列,于是便给定了一个正整数数列.第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作.第三分钟,k说,要能查询, ...
- bzoj3038 上帝造题的七分钟2
Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对 ...
随机推荐
- 不要怂,就是GAN (生成式对抗网络) (一)
前面我们用 TensorFlow 写了简单的 cifar10 分类的代码,得到还不错的结果,下面我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodf ...
- salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载
目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新公司,主要做的就是salesforce,不过当时想要看一些相关资料确实比较难.为了避免想要零基础学习的人 ...
- Java面试(2)-- Java算数表达式
class Demo02{ public static void main(String[] args){ //算数运算符 +,-,*,/,%,++,-- //例1 int a = 1; int b ...
- jquery 的队列queue
使用示列代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- CCNA网络工程师学习进程(5)路由器和交换机的登录安全配置和vlan划分
本节详细介绍路由器和交换机的登录安全配置以及VLAN划分的原理. (1)登录安全配置: 路由器登录有两种验证方式:有本地验证方式和远程验证方式.本地登录验证方式可以配置用户名和密码也可 ...
- 【WP 8.1开发】解决摄像头翻转问题(RuntimeApp篇)
昨天,我非常马虎地给大家说了有关处理物理摄像头翻转的话题,今天,还是这个话题,而且内容不差,只是为了完整性,顺便也提供了运行时API的版本,其实实现起来与SL框架版本差不多,毕竟这两个框架都有不少AP ...
- base64:URL背景图片与web页面性能优化
一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息. 某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什 ...
- PopupWindow+ListView+OnItemClick点击无效
昨天踩了个大坑,从下午折腾到现在.实现以下功能: popupWindow显示listview,listView OnItemClick点击后获取值. 由于重写listview 是有两部分 列表正文和右 ...
- 【Discuz】关闭QQ互联插件提示信息:系统繁忙,请稍后再试
版本:X3.2.20160601 提示信息 系统繁忙,请稍后再试 解决方案 Step1.删除QQ互联插件目录 网站的根目录\source\plugin\qqconnect Step2.上传原始QQ互联 ...
- 用命令行编译java并生成可执行的jar包
用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...