BZOJ3211 花神游历各国 【树状数组 + 并查集】
题目
输入格式
输出格式
每次x=1时,每行一个整数,表示这次旅行的开心度
输入样例
4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4
输出样例
101
11
11
数据
对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9
题解
类似于重复开根以及取模之类的操作都有个共性,就是重复取的次数非常少
以本题开根为例,当取到一定次数时,就会变为1
我们用树状数组维护区间和
用并查集维护当前位置往下【包括当前位置】,最近还可以开根的位置
每次暴力开根维护树状数组即可【最多开5*N次】
#include<iostream>
#include<cstdio>
#include<cmath>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 100005,maxm = 100005,INF = 1000000000;
inline int RD(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
int N,M,pre[maxn],num[maxn];
LL A[maxn];
void add(int u,LL v){while (u <= N) A[u] += v,u += lbt(u);}
LL query(int u){LL ans = 0; while(u) ans += A[u],u -= lbt(u); return ans;}
LL sum(int l,int r){return query(r) - query(l - 1);}
int find(int u){return u == pre[u] ? u : pre[u] = find(pre[u]);}
int main(){
N = RD();
REP(i,N){
num[i] = RD(); add(i,num[i]);
pre[i] = (num[i] != 0 && num[i] != 1) ? i : i + 1;
}pre[N + 1] = N + 1;
M = RD();
int cmd,l,r,u,v;
while (M--){
cmd = RD(); l = RD(); r = RD();
if (cmd & 1) printf("%lld\n",sum(l,r));
else {
u = find(l);
while (u <= r){
v = (LL)sqrt(num[u]); add(u,v - num[u]);
num[u] = v;
if (num[u] == 1 || num[u] == 0) pre[u] = u + 1;
u++;
}
}
}
return 0;
}
BZOJ3211 花神游历各国 【树状数组 + 并查集】的更多相关文章
- 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]
题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...
- [BZOJ3038]上帝造题的七分钟2 树状数组+并查集
考试的时候用了两个树状数组去优化,暴力修改,树状数组维护修改后区间差值还有最终求和,最后骗了40分.. 这道题有好多种做法,求和好说,最主要的是开方.这道题过的关键就是掌握一点:在数据范围内,最多开方 ...
- [BZOJ3211]花神游历各国&&[BZOJ3038] 上帝造题的七分钟2 树状数组+并查集
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 4057 Solved: 1480[Submit][Status][Discu ...
- BZOJ 3211 花神游历各国 (树状数组+并查集)
题解:首先,单点修改求区间和可以用树状数组实现,因为开平方很耗时间,所以在这个方面可以优化,我们知道,开平方开几次之后数字就会等于1 ,所以,用数组记录下一个应该开的数,每次直接跳到下一个不是1的数字 ...
- luogu 4145 花神游历各国 线段树/树状数组+并查集
此题一看便是RMQ问题,但是由于开平方的特殊操作,tag操作失效 此时发现特性:sqrt最多执行6此便使值到达1/0,此时可以剪枝不进行该操作,利用并查集到达特性找根,根代表还可以进行操作的点,再利用 ...
- POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)
传送门 The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8690 Acce ...
- SPOJ GSS4 Can you answer these queries IV ——树状数组 并查集
[题目分析] 区间开方+区间求和. 由于区间开方次数较少,直接并查集维护下一个不是1的数的位置,然后暴力修改,树状数组求和即可. 这不是BZOJ上上帝造题7分钟嘛 [代码] #include < ...
- CodeVS2492 上帝造题的七分钟2(树状数组+并查集)
传送门 树状数组模板题.注意优化,假设某个数的值已经是1了的话.那么我们以后就不用对他进行操作了,这个能够用并查集实现. 这道题还有个坑的地方,给出查询区间端点的a,b,有可能a>b. #inc ...
- BZOJ 3038 上帝造题的七分钟2 树状数组+并查集
题目大意:一个序列,有两种操作.1.将一段数中的每个数开根号.2.查询一段数的和. 思路:和3211是一个题,有兴趣的能够看看我的那篇博客. CODE: #include <cmath> ...
随机推荐
- C#中在WebClient中使用post发送数据实现方法
很多时候,我们需要使用C#中的WebClient 来收发数据,WebClient 类提供向 URI 标识的任何本地.Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法 ...
- ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)
因项目没有PC站所以没有写电脑网站支付. Pay.php支付控制器 <?php // +----------------------------------------------------- ...
- MIP组件开发 自定义js组件开发步骤
什么是百度MIP? MIP(Mobile Instant Pages - 移动网页加速器)主要用于移动端页面加速 官网参考:https://www.mipengine.org/doc/00-mip-1 ...
- Create Fiori List App Report with ABAP CDS view – PART 2
In the Part 1 blog, we have discussed below topics CDS annotations for Fiori List Report. How to cre ...
- CSS3单选动画
本示例实现了两种单选按钮动画效果,一种是缩放,一种是旋转,以下是html布局以及css样式 html:这里使用了label标签的for属性,以此来绑定radio <div class=" ...
- html页面导出word文档
1.加入两个外部js 1)FileSaver.js /* FileSaver.js * A saveAs() FileSaver implementation. * 1.3.2 * 2016-06-1 ...
- fastlane自动化打包ipa并发布到firim或者蒲公英
1.打开终端,确保Xcode Command Line Tools 安装了最新版 xcode-select --install 2.安装fastlane sudo gem install -n /us ...
- 怎么防止别人动态在你程序生成代码(怎么防止别人反编译你的app)
1.本地数据加密 iOS应用防反编译加密技术之一:对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息 2.URL编码加密 iOS应用防反编译加密技术之二:对程序中出现的U ...
- springmvc基础篇—处理图片静态资源文件
当我们在web.xml中对DispatcherServlet的过滤设置为/ 的时候,表示对所有的路径进行拦截过滤,那么不可避免的就会产生一个问题,那就是像图片这种静态资源文件我明明引用路径有,但就是加 ...
- 如何激活win10
第一步:用管理员权限打开命令提示符: 第二步:输入命令---slmgr.vbs /upk (成功卸载了产品密钥) 第三步:slmgr /ipk NPP ...