这是一道关于线段树的区间开根号的裸题,没什么好讲的。

  值得注意的是,因为有区间开根号的性质,所以我们每一次更改操作只能把更改区间所覆盖的所有元素全部查找,当然你直接找效率明显爆炸。。。

  能够注意到,指数级别的操作一次更改的数字都很大,而题目的数字最大是10的9次,所以可以注意到的是当一个区间更新6遍以后就失去更新的意义了,因为当你更改次数超过6次所有非负整数数字就全部会化为1。所以可以在每一个节点上加一个类似于LAZY标记的东西,记录开根号次数,以便节约跟新时间。

  贴出题目&代码

Description

 线段树区间开根号与求和

Input

 第一行N代表有N个数
第二行有N个数,代表这N个值分别是多少
第三行有一个M
接下来M行,每行有X,L,R
当X为1代表求区间:(L,R)的和。
当X为2代表对区间:(L,R)开根号。

Output

每次x=1时,每行一个整数,表示区间和

Sample Input

4

1 100 5 5


5


1 1 2


2 1 2


1 1 2


2 2 3


1 1 4

Sample Output

101

11


11

HINT

对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9

 /**************************************************************
Problem: 3211
User: PencilWang
Language: C++
Result: Accepted
Time:1996 ms
Memory:9036 kb
****************************************************************/ #include<cstdio>
#include<cmath>
int n,m;
struct shit{
int L,R,t;
long long num;
}s[];
int w[];
void push_up(int p)
{
s[p].num=s[p<<].num+s[p<<|].num;
return ;
}
void build(int p,int l,int r)
{
s[p].L=l;
s[p].R=r;
if(l==r)
{
s[p].num=w[l];
return ;
}
int mid=(l+r)>>;
build(p<<,l,mid);
build(p<<|,mid+,r);
push_up(p);
return ;
}
void fuck(int p,int a,int b)
{
if(a<=s[p].L&&s[p].R<=b)
{
s[p].t++;
if(s[p].L==s[p].R)
{
s[p].num=sqrt(s[p].num);
return ;
}
}
int mid=(s[p].L+s[p].R)>>;
if(s[p<<].t<&&a<=mid)fuck(p<<,a,b);
if(s[p<<|].t<&&b>mid)fuck(p<<|,a,b);
push_up(p);
return ;
}
long long Q(int p,int a,int b)
{
if(a<=s[p].L&&s[p].R<=b)
{
return s[p].num;
}
long long ans=;
int mid=(s[p].L+s[p].R)>>;
if(a<=mid) ans+=Q(p<<,a,b);
if(b>mid)ans+=Q(p<<|,a,b);
return ans;
}
int main()
{
int a,b,f;
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",w+i);
scanf("%d",&m);
build(,,n);
while(m--)
{
scanf("%d%d%d",&f,&a,&b);
if(f-)fuck(,a,b);
else printf("%lld\n",Q(,a,b));
}
return ;
}

3211

刷题向》关于线段树的区间开根号 BZOJ3211(NORMAL+)的更多相关文章

  1. hdu 4027 Can you answer these queries? 线段树区间开根号,区间求和

    Can you answer these queries? Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...

  2. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  4. 线段树离散化+区间更新——cf1179C好题

    绝对是很好的题 把问题转化成当第i个询问的答案是数值x时是否可行 要判断值x是否可行,只要再将问题转化成a数组里>=x的值数量是否严格大于b数组里的>=x的值 那么线段树叶子结点维护对于值 ...

  5. Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并

    D. Developing Game   Pavel is going to make a game of his dream. However, he knows that he can't mak ...

  6. 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

    原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...

  7. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  8. HDU-6315 Naive Operations//2018 Multi-University Training Contest 2___1007 (线段树,区间除法)

    原题地址 Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/ ...

  9. 线段树_区间加乘(洛谷P3373模板)

    题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字 ...

随机推荐

  1. 【Java 并发】Executor框架机制与线程池配置使用

    [Java 并发]Executor框架机制与线程池配置使用 一,Executor框架Executor框架便是Java 5中引入的,其内部使用了线程池机制,在java.util.cocurrent 包下 ...

  2. POJ 2029 Palindromes _easy version

    #include<cstdio> #include<cstring> using namespace std; int main() { int n; ]; scanf(&qu ...

  3. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  4. python3 csv数据读入/写出

    这是读入 1 import csv 2 #打开文件,用with打开可以不用去特意关闭file了,python3不支持file()打开文件,只能用open() 3 with open("XXX ...

  5. JS、Jquery获取浏览器和屏幕各种高度宽度

    网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth ...

  6. C# 用wps(api v9) 将word转成pdf

    我们不产生代码只是代码的搬运工 我们先来看一段跑不起来的代码  ..各种未将对象应用到实例.. using System; using System.Collections.Generic; usin ...

  7. Java开发前期准备工作

    配置Java开发环境变量 在"系统变量"中设置3项属性,JAVA_HOME, PATH, CLASSPATH. 变量设置参数如下: 变量名:JAVA_HOME 变量值:C:\Pro ...

  8. linux基础命令复习

    1.ls 查看文件和文件夹 1).ls -a 查看文件和文件夹,包括隐藏的 2).ls  -l 查看文件和文件夹详情 3).ls  -lh   查看文件和文件夹详情,自动生成文件大小单位 4).ls ...

  9. Maven依赖war开发,找不到war里头的class解决方案

    问题描述: 开发一个web系统,需要引用另一个excel.war[在该系统里头是一个excel的导入导出小模块]进行项目 <dependency> <groupId>com.b ...

  10. Java 虚拟机-垃圾收集算法

    本文主要介绍Java虚拟机的垃圾回收算法. 一.概述 二.标记-清除算法 Mark-Sweep.如同名字,该算法分两步: 标记:标记处需要回收的对象 清除:标记完成后统一回收被标记的对象. 缺点: 效 ...