题意:http://uoj.ac/problem/228

sol  :线段树开根操作

   对于节点x,可以在max[x]-min[x]<=1时直接做,转化为区间减或区间覆盖

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int Mx=;
int n,m,a[Mx],Min[Mx],Max[Mx],sum[Mx];
int l[Mx],r[Mx],lson[Mx],rson[Mx],Add_tag[Mx],Cover_tag[Mx]; void pushup(int x)
{
int L=lson[x],R=rson[x];
Min[x]=min(Min[L],Min[R]);
Max[x]=max(Max[L],Max[R]);
sum[x]=sum[L]+sum[R];
} void build(int x,int L,int R)
{
l[x]=L,r[x]=R,lson[x]=x<<,rson[x]=x<<|;
if(L==R) { Min[x]=a[L],Max[x]=a[L],sum[x]=a[L]; return ;}
int mid=(L+R)>>;
build(x<<,L,mid);
build(x<<|,mid+,R);
pushup(x);
} void pushdown(int x)
{
int LS=lson[x],RS=rson[x],LL=l[LS],LR=r[LS],RL=l[RS],RR=r[RS];
if(Add_tag[x]!=)
{
Max[LS]+=Add_tag[x],Min[LS]+=Add_tag[x],sum[LS]+=(LR-LL+)*Add_tag[x];
Max[RS]+=Add_tag[x],Min[RS]+=Add_tag[x],sum[RS]+=(RR-RL+)*Add_tag[x];
if(Cover_tag[LS]<1e8) Cover_tag[LS]+=Add_tag[x];
else Add_tag[LS]+=Add_tag[x];
if(Cover_tag[RS]<1e8) Cover_tag[RS]+=Add_tag[x];
else Add_tag[RS]+=Add_tag[x];
}
if(Cover_tag[x]<1e8)
{
Max[LS]=Cover_tag[x],Min[LS]=Cover_tag[x],sum[LS]=(LR-LL+)*Cover_tag[x];
Max[RS]=Cover_tag[x],Min[RS]=Cover_tag[x],sum[RS]=(RR-RL+)*Cover_tag[x];
Cover_tag[LS]=Cover_tag[x];
Cover_tag[RS]=Cover_tag[x];
}
Add_tag[x]=,Cover_tag[x]=1e9;
} void Add(int x,int ql,int qr,int val)
{
int L=l[x],R=r[x];
if(ql>R||qr<L) return ;
if(ql<=L&&qr>=R)
{
if(Cover_tag[x]<1e8) Cover_tag[x]+=val;
else Add_tag[x]+=val;
Max[x]+=val,Min[x]+=val,sum[x]+=(R-L+)*val;
return ;
}
pushdown(x);
Add(lson[x],ql,qr,val);
Add(rson[x],ql,qr,val);
pushup(x);
} void Cover(int x,int ql,int qr,int val)
{
int L=l[x],R=r[x];
Add_tag[x]=,Cover_tag[x]=val;
Max[x]=val,Min[x]=val,sum[x]=(R-L+)*val;
} void Sqrt(int x,int ql,int qr)
{
int L=l[x],R=r[x];
if(ql>R||qr<L) return ;
if(ql<=L&&qr>=R&&Max[x]-Min[x]<=)
{
int mx=(int)sqrt(Max[x]),mn=(int)sqrt(Min[x]);
if(mx==mn) Cover(x,L,R,mx);
else Add(x,L,R,mx-Max[x]);
return ;
}
pushdown(x);
Sqrt(lson[x],ql,qr);
Sqrt(rson[x],ql,qr);
pushup(x);
} int Query(int x,int ql,int qr)
{
int L=l[x],R=r[x];
if(ql>R||qr<L) return ;
if(ql<=L&&qr>=R) return sum[x];
pushdown(x);
int ans=Query(lson[x],ql,qr)+Query(rson[x],ql,qr);
pushup(x);
return ans;
} signed main()
{
for(int i=;i<Mx;i++) Cover_tag[i]=1e9;
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
build(,,n);
for(int i=,num,x,y,z;i<=m;i++)
{
scanf("%lld%lld%lld",&num,&x,&y);
if(num==) scanf("%lld",&z),Add(,x,y,z);
if(num==) Sqrt(,x,y);
if(num==) printf("%lld\n",Query(,x,y));
}
return ;
}

uoj228:基础数据结构练习题的更多相关文章

  1. uoj228 基础数据结构练习题

    趁别人题解没有放出来赶快写一篇 整数序列,操作 区间加 区间变成sqrt(下取整) 区间和 考虑一下对于每个区间里所有sqrt不同的段操作,那么可以在O(段数logn)一次的时间内完成sqrt操作.考 ...

  2. [UOJ228] 基础数据结构练习题 - 线段树

    考虑到一个数开根号 \(loglog\) 次后就会变成1,设某个Node的势能为 \(loglog(maxv-minv)\) ,那么一次根号操作会使得势能下降 \(1\) ,一次加操作最多增加 \(l ...

  3. 【UOJ228】基础数据结构练习题(线段树)

    [UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...

  4. 【UOJ#228】基础数据结构练习题 线段树

    #228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...

  5. uoj #228. 基础数据结构练习题 线段树

    #228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...

  6. 【线段树】uoj#228. 基础数据结构练习题

    get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...

  7. 【uoj228】 基础数据结构练习题

    http://uoj.ac/problem/228 (题目链接) 题意 给出一个序列,维护区间加法,区间开根,区间求和 Solution 线段树.考虑区间开根怎么做.当区间的最大值与最小值相等时,我们 ...

  8. UOJ228:基础数据结构练习题——题解

    http://uoj.ac/problem/228 参考:https://www.cnblogs.com/ljh2000-jump/p/6357583.html 考虑当整个区间的最大值开方==最小值开 ...

  9. UOJ228 简单数据结构练习题

    Description 传送门 维护一个数列, 有以下操作: 对[l,r]同时加上x 把[l,r]开根后下取整. 查询[l,r]之和 n,m \(\leq\)$ 100000, $\(a_i,x \l ...

随机推荐

  1. RocketMQ源码分析之RocketMQ事务消息实现原理中篇----事务消息状态回查

    上节已经梳理了RocketMQ发送事务消息的流程(基于二阶段提交),本节将继续深入学习事务状态消息回查,我们知道,第一次提交到消息服务器时消息的主题被替换为RMQ_SYS_TRANS_HALF_TOP ...

  2. JDK5 新特性

     JDK5新特性目录导航: 自动拆装箱 Foreach 静态导入 可变参数 Var args 枚举 格式化输出 泛型 ProcessBuilder 内省 线程并发库(JUC) 监控和管理虚拟机 元数据 ...

  3. 【yii2】rules规则的默认值

    ExampleModel.php /** * {@inheritdoc} */ public function rules() { return [ ['updated_at','default',' ...

  4. python IDLE中如何执行for、while、if等多行语句

    >>> f=open("E:/pythonLearn/140.txt") >>> for line in f.readlines(): prin ...

  5. P1338 末日的传说 逆序数对

    题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...

  6. maston总结

    Substitution Tags(替换标签) % ; # this is embedded Perl You have <% $cd_count %> CDs. Escaping sub ...

  7. 利用HttpClient测试

    import java.io.IOException;import java.security.cert.CertificateException;import java.security.cert. ...

  8. Windows GitLab使用全过程

    1.首先安装Git 1.1.下载网站: https://git-for-windows.github.io/ 1.2.安装Git参考网站 http://blog.csdn.net/u012614287 ...

  9. 5-1 练习css 总结

    1. 边框 border:3px dotted; border: 2px solid yellow; 背景颜色 background-color: red; 外攘 margin:20px 0 20px ...

  10. hadoop中节点上的nodemanager一直启动不起来

    当我们启动Hadoop集群的时候,发现有一台机器的nodemanager启动后自动关闭, 查看日志的时候发现有错误:yarn-root-nodemanager-log 解决办法: netstat  a ...