[BZOJ3038]上帝造题的七分钟2 树状数组+并查集
考试的时候用了两个树状数组去优化,暴力修改,树状数组维护修改后区间差值还有最终求和,最后骗了40分。。
这道题有好多种做法,求和好说,最主要的是开方。这道题过的关键就是掌握一点:在数据范围内,最多开方五六次就会变成1,这样以后再修改就不用修改了。
① 线段树打标记
② 分块打标记
③ 树状数组+并查集
因为我考试的时候用的树状数组,所以直接打的第三种,相对来说代码量也少一些。
思路:开始时父亲都指向自己,如果变成1,就把父亲指向下一个位置即可。修改的时候相当于跳着修改。代码当中会有注解。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
#define N 201000
#define LL long long
int n,m;
LL c[N],cha[N];
LL a[N];
LL fa[N];
LL lowbit(int x)
{
return x&(-x);
}
void add(LL i,LL x)
{
while(i<=n)
{
c[i]+=x;
i+=lowbit(i);
}
}
LL tot(int i)
{
LL sum=0;
while(i>0)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
LL sum1(int i,int j)
{
return tot(j)-tot(i-1);
}
LL find(int x)
{
if(fa[x]!=x)
fa[x]=find(fa[x]);
return fa[x];
}
int main()
{
//freopen("god.in","r",stdin);
//freopen("god.out","w",stdout);
scanf("%d",&n);
pos(i,1,n+10)
fa[i]=i;
pos(i,1,n)
{
scanf("%lld",&a[i]);
add(i,a[i]);
if(a[i]<=1)
fa[i]=find(find(i)+1);//插入时如果小于等于1,就指向下一位
}
scanf("%d",&m);
pos(i,1,m)
{
int k,l,r;
scanf("%d%d%d",&k,&l,&r);
if(l>r)
swap(l,r);
if(k==0)
{
for(LL j=find(l);j<=r;j=find(j+1))//循环时直接跳着循环
{
LL tmp=(LL)sqrt(a[j]);
add(j,tmp-a[j]);//相当于把节点修改为更改之后的值
a[j]=tmp;
if(a[j]<=1)
fa[j]=find(j+1);//压缩路径
}
}
else
printf("%lld\n",sum1(l,r));
}
//while(1);
return 0;
}
[BZOJ3038]上帝造题的七分钟2 树状数组+并查集的更多相关文章
- [BZOJ3211]花神游历各国&&[BZOJ3038] 上帝造题的七分钟2 树状数组+并查集
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 4057 Solved: 1480[Submit][Status][Discu ...
- CodeVS2492 上帝造题的七分钟2(树状数组+并查集)
传送门 树状数组模板题.注意优化,假设某个数的值已经是1了的话.那么我们以后就不用对他进行操作了,这个能够用并查集实现. 这道题还有个坑的地方,给出查询区间端点的a,b,有可能a>b. #inc ...
- BZOJ 3038 上帝造题的七分钟2 树状数组+并查集
题目大意:一个序列,有两种操作.1.将一段数中的每个数开根号.2.查询一段数的和. 思路:和3211是一个题,有兴趣的能够看看我的那篇博客. CODE: #include <cmath> ...
- BZOJ_3132_上帝造题的七分钟_树状数组
BZOJ_3132_上帝造题的七分钟_树状数组 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b), ...
- TYVJ 1941 BZOJ3038 上帝造题的七分钟2 并查集+树状数组
背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段数中每个 ...
- bzoj3211花神游历各国&&bzoj3038上帝造题的七分钟2*
bzoj3211花神游历各国 题意: n个数的序列,m个操作,操作两种:区间开根(向下取整)和区间求和.n≤100000,m≤200000,序列中的数非负且≤109. 题解: 一个≤109的数开6次根 ...
- Bzoj3038 上帝造题的七分钟2 线段树
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1135 Solved: 509 Description XLk觉得<上帝造题的七分钟>不太 ...
- bzoj3038 上帝造题的七分钟2
Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对 ...
- Bzoj3038 上帝造题的七分钟2 并查集
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1135 Solved: 509 Description XLk觉得<上帝造题的七分钟>不太 ...
随机推荐
- MATLAB命令大全和矩阵操作大全
转载自: http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示在MATLAB中创建矩阵 ...
- [leetcode-556-Next Greater Element III]
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
- ajax数据请求2(json格式)
ajax数据请求2(json格式) <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- String,StringBuffer与StringBuilder
1. String,StringBuffer与StringBuilder的区别 String:存储在常量池中:是不可变的字符序列,任何对String值的改变都会引发新的String对象的生成,因此执行 ...
- 词向量-LRWE模型
上一节,我们介绍利用文本和知识库融合训练词向量的方法,如何更好的融合这些结构化知识呢?使得训练得到的词向量更具有泛化能力,能有效识别同义词反义词,又能学习到上下文信息还有不同级别的语义信息. 基于上述 ...
- Tagged Pointer
前言 在2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念.对于6 ...
- windows 10 下使用 binwalk
刚接触CTF没什么经验,菜鸟一只很多题不会做,就在网上看大佬写的Write up.发现经常会用到一个小工具--binwalk.binwalk在kali系统里是一个自带的工具,但windows可没有.之 ...
- 说声PHP的setter&getter(魔术)方法,你们辛苦了
php作为快速迭代项目的语言,其牛逼性质自不必多说.今天咱们要来说说php语言几个魔术方法,当然了,主要以setter&getter方法为主. 首先,咱们得知道什么叫魔术方法? 官方定义为:_ ...
- HDU 2955 Robberies(DP)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2955 题目: Problem Description The aspiring Roy the Rob ...
- Mac终端查看sqlite3数据库、表数据等
背景: 我们在用FMDB处理iOS数据库时,沙盒里保存的数据库格式为.sqlite3. 当我们需要在模拟器上调试或查看数据库内容时,我们可以直接在终端里查看到. 正文: 1.在沙盒路径找到需要查看到文 ...