上帝造题的七分钟2 bzoj-3038

题目大意:给定一个序列,支持:区间开方;查询区间和。

注释:$1\le n\le 10^5$,$1\le val[i] \le 10^{12}$。

想法:这题还挺挺有意思的。查询区间和我们可以用前缀和,但是用上去区间修改就不难想到线段树。那么我们思考如何在log的时间之内完成区间开方。直接打lazy显然实现不了,其实我们发现,每一个$10^{12}$之内的数最多只需要开6次方就可以变成1,$10^{12}$开6次根号是1.53993。所以我们对每一个区间用一个mark标记表示这个区间是不是全是1。如果不是的话,我就暴力修改。这样的话每一个数最多会被修改6次,所以总时间复杂度是O(n*a),a是log级别的。

P.S.:花神那道题卡读入,不加读入优化会T... ...

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 100010
#define lson pos<<1
#define rson pos<<1|1
using namespace std;
typedef long long ll;
ll sum[N<<2],a[N];
int n,m;
inline void pushup(int pos)
{
sum[pos]=sum[lson]+sum[rson];
}
void build(int pos,int l,int r)
{
if(l==r)
{
sum[pos]=a[l];
return;
}
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
pushup(pos);
}
void update(int pos,int l,int r,int x,int y)
{
if(x>y)swap(x,y);
if(sum[pos]==r-l+1)return;
if(l==r)
{
sum[pos]=(ll)sqrt(sum[pos]+0.5);
return;
}
int mid=(l+r)>>1;
if(y<=mid) update(lson,l,mid,x,y);
else if(x>mid) update(rson,mid+1,r,x,y);
else update(lson,l,mid,x,y),update(rson,mid+1,r,x,y);
pushup(pos);
}
ll getsum(int pos,int l,int r,int x,int y)
{
if(x>y) swap(x,y);
if(x<=l&&r<=y) return sum[pos];
int mid=(l+r)>>1;
if(y<=mid)return getsum(lson,l,mid,x,y);
if(x>mid)return getsum(rson,mid+1,r,x,y);
return getsum(lson,l,mid,x,y)+getsum(rson,mid+1,r,x,y);
}
void output()
{
printf("Fuck : %lld\n",sum[1]);
}
int main()
{
cin >> n ;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
cin >> m ;
for(int k,x,y,i=1;i<=m;i++)
{
scanf("%d%d%d",&k,&x,&y);
if(!k) update(1,1,n,x,y);
else printf("%lld\n",getsum(1,1,n,x,y));
// output();
}
return 0;
}

小结:线段树是很神奇的...qwq

[bzoj3038/3211]上帝造题的七分钟2/花神游历各国_线段树的更多相关文章

  1. P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)

    有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管. #include<bits/s ...

  2. 上帝造题的七分钟2/花神游历各国/GSS4 线段树维护区间开方 By cellur925

    题目传送门 或者 另一个传送门 询问区间和都好说.但是开方?? 其实是这样的,一个数(1e9)以内连续开方6次就会变成1,于是我们就可在开方操作上进行暴力修改.暴力修改的意思其实也就是找到叶子节点进行 ...

  3. GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 (线段树)

    GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 GSS4 - Can you answer these qu ...

  4. 题解 洛谷 P4145 【上帝造题的七分钟2 / 花神游历各国】

    题目 上帝造题的七分钟2 / 花神游历各国 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. ...

  5. 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]

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

  6. 洛谷P4145——上帝造题的七分钟2 / 花神游历各国

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

  7. 【luogu4145】上帝造题的七分钟2 / 花神游历各国--区间开根-线段树

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

  8. 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)

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

  9. 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国

    原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...

随机推荐

  1. Codeforces--617B--Chocolate(规律)

     Chocolate Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit ...

  2. WPF:通过Window.DataContext实现窗口间传值

    通过Window.DataContext实现窗口之间的传值,特别是跨窗口控件的联动,具有无可比拟的优势.实现方法如下: 1.  MainWindow.xaml,在Window.DataContext中 ...

  3. c++ valarray 实现矩阵与向量相乘

    #include <iostream>#include <valarray> template<class T> class Slice_iter { std::v ...

  4. Java 8 实战 P4 Beyond Java 8

    目录 Chapter 13. Thinking functionally Chapter 14. Functional programming techniques Chapter 15. compa ...

  5. android 从assets和res中读取文件(转)

    1. 相关文件夹介绍      在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件 ...

  6. [Apple开发者帐户帮助]三、创建证书(7)创建证书签名请求

    Mac上的Keychain Access允许您创建证书签名请求(CSR). 启动位于的Keychain Access /Applications/Utilities. 选择Keychain Acces ...

  7. Objective-C—— Block

    OC Block 其实功能就类似C语言的函数指针,js中的闭包之类的.把代码块当做一个变量就行操作,有自己的变量和作用域. 简单看一下Block的语法和可能出现的问题: Block语法: block语 ...

  8. 最简单的多线程死锁案例代码(Java语言)

    package com.thread.test; public class DeadLock { private static Object firstMonitor = new Object(); ...

  9. android studio高德地图的显示于定位(附带逆地理编码围栏)

    首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...

  10. MongoDB安装使用教程

    参考菜鸟教程:http://www.runoob.com/mongodb/mongodb-tutorial.html