【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5828

【题目大意】

  给出一个数列,要求支持区间加法,区间开方和区间和查询操作。

【题解】

  考虑开方后会出现成片相同的数字,因此我们在每个区间额外维护区间内数字是否相同的tag,如果区间内数字均相同,那么开方就可以转化为减法的标记,即t=sqrt(t)转化为tag=sqrt(t)-t。剩下就是简单的标记维护了。

【代码】

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=2000000;
struct node{int l,r,f,a,b;long long tag,max,val;}T[N];
int cas,tot,n,m,l,r,c,op,num;
void addtag(int x,int tag){
T[x].tag+=tag;
T[x].max+=tag;
T[x].val+=(long long)tag*(T[x].b-T[x].a+1);
}
void pb(int x){
if(T[x].l){addtag(T[x].l,T[x].tag);addtag(T[x].r,T[x].tag);}
T[x].tag=0;
}
void up(int x){
T[x].max=max(T[T[x].l].max,T[T[x].r].max);
T[x].val=T[T[x].l].val+T[T[x].r].val;
if(T[T[x].l].f&&T[T[x].r].f&&T[T[x].l].max==T[T[x].r].max)T[x].f=1;
else T[x].f=0;
}
void build(int l,int r){
int x=++tot;
T[x].a=l;T[x].b=r;T[x].f=0;
T[x].tag=T[x].l=T[x].r=T[x].max=T[x].val=0;
if(l==r){T[x].f=1;scanf("%lld",&T[x].val);T[x].max=T[x].val;return;}
int mid=(l+r)>>1;
T[x].l=tot+1;build(l,mid);
T[x].r=tot+1;build(mid+1,r);
up(x);
}
void change(int x,int a,int b,int p){
if(T[x].a>=a&&T[x].b<=b){addtag(x,p);return;}
if(T[x].tag)pb(x); int mid=(T[x].a+T[x].b)>>1;
if(mid>=a&&T[x].l)change(T[x].l,a,b,p);
if(mid<b&&T[x].r)change(T[x].r,a,b,p);up(x);
}
long long query_sum(int x,int a,int b){
if(T[x].a>=a&&T[x].b<=b)return T[x].val;
if(T[x].tag)pb(x);int mid=(T[x].a+T[x].b)>>1;long long res=0;
if(mid>=a&&T[x].l)res+=query_sum(T[x].l,a,b);
if(mid<b&&T[x].r)res+=query_sum(T[x].r,a,b);
return res;
}
void Tsqrt(int x,int a,int b){
if(T[x].a>=a&&T[x].b<=b){
if(T[x].f){
long long t=T[x].max;
t=sqrt(t);
addtag(x,t-T[x].max);
return;
}
}if(T[x].tag)pb(x); int mid=(T[x].a+T[x].b)>>1;
if(mid>=a&&T[x].l)Tsqrt(T[x].l,a,b);
if(mid<b&&T[x].r)Tsqrt(T[x].r,a,b);up(x);
}
int main(){
scanf("%d",&cas);
while(cas--){
scanf("%d%d",&n,&m);
build(1,n);tot=0;
while(m--){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&l,&r,&num);
change(1,l,r,num);
}else if(op==2){
scanf("%d%d",&l,&r);
Tsqrt(1,l,r);
}else{
scanf("%d%d",&l,&r);
printf("%lld\n",query_sum(1,l,r));
}
}
}return 0;
}

  

HDU 5828 Rikka with Sequence(线段树)的更多相关文章

  1. hdu 5828 Rikka with Sequence 线段树

    Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

  2. HDU 5828 Rikka with Sequence (线段树+剪枝优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5828 给你n个数,三种操作.操作1是将l到r之间的数都加上x:操作2是将l到r之间的数都开方:操作3是 ...

  3. HDU 5828 Rikka with Sequence(线段树区间加开根求和)

    Problem DescriptionAs we know, Rikka is poor at math. Yuta is worrying about this situation, so he g ...

  4. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  5. 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence

    // 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence // 题意:三种操作,1增加值,2开根,3求和 // 思路:这题与HDU 4027 和HDU 5634 ...

  6. HDU 5828 Rikka with Sequence (线段树)

    Rikka with Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

  7. HDU 5828 Rikka with Sequence(线段树 开根号)

    Rikka with Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  8. hdu 4893 Wow! Such Sequence!(线段树)

    题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...

  9. HDU 6089 Rikka with Terrorist (线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...

  10. HDU 5634 Rikka with Phi 线段树

    题意:bc round 73 div1 D 中文题面 分析:注意到10^7之内的数最多phi O(log(n))次就会变成1, 因此可以考虑把一段相同的不为1的数缩成一个点,用平衡树来维护. 每次求p ...

随机推荐

  1. svn服务器配置小记

    在这里/opt/svndata/repos1创建svn版本库svnadmin create /opt/svndata/repos1 创建成功后会在/opt/svndata/repos1目录下生成con ...

  2. HTML5 Placeholder实现input背景文字提示效果

    这篇文章我们来看看什么是input输入框背景文字提示效果,如下图所示: 这种效果现在网上非常的普遍流行,但大部分是使用JavaScript实现的.但HTML5给我们提供了新的纯HTML的实现方式,不需 ...

  3. crt 糟心的配置

    每次要下载安装crt就要捣鼓半天,各种注册机下来各种问题,顺手记录下刚打通的一个 1.crt 下载 网上看了一遍博客: SecureCRT 7.3.4破解版(含注册机), 下载下来后里面其实是不含注册 ...

  4. Zend Studio 12 大集合

    前言 本文记录了我个人使用Zend Studio 12的点点滴滴,不定时更新. 内容来源于网络,如有侵权,告知后可删除. 下载 官方链接点击链接,填入相关信息即可下载. 破解 声明:请购买正版,非万不 ...

  5. mini-httpd源码分析-version.h

    /* version.h - version defines for mini_httpd */ #ifndef _VERSION_H_ #define _VERSION_H_ #define SER ...

  6. jmake 编译当前目录所有c/c++单文件

    在一个目录下写一些单文件的c或者c++文件时,每次敲出命令如g++ a.cpp -o a感觉比较麻烦. 所以就模仿makefile的功能,实现了扫描当前目录,并将所有c文件.cc文件.cpp文件直接调 ...

  7. Oracle单个数据文件超过32G后扩容

    Oracle单个数据文件超过32G后扩容   表空间数据文件容量与DB_BLOCK_SIZE的设置有关,而这个参数在创建数据库实例的时候就已经指定.DB_BLOCK_SIZE参数可以设置为4K.8K. ...

  8. android 栈方式退出

    介于list退出方式会使内存溢出,使用自己维护栈的方式. 参考: http://www.2cto.com/kf/201312/265523.html http://www.cnblogs.com/ma ...

  9. 使用MySQL处理百万级以上数据时,不得不知道的几个常识

    最近一段时间参与的项目要操作百万级数据量的数据,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍.之前数据量小的时候,查询语句的好坏不会对执行时间有什么明显的 ...

  10. java.util.zip.GZIPInputStream.readUByte,Not in GZIP format错误处理

    问题一: 使用webclient抓取网页时报错:(GZIPInputStream.java:207) atjava.util.zip.GZIPInputStream.readUShort(GZIPIn ...