题意: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. poj_1995_Raising Modulo Numbers

    Description People are different. Some secretly read magazines full of interesting girls' pictures, ...

  2. spring-AspectJ

    动态代理 ProxyFactoryBean织入切面数量太多不利于围护 BeanNameAutoProxyCreater-------------根据Bean名称创建代理 DefaultAdvisorA ...

  3. Docker自学纪实(六)搭建docker私有仓库

    docker的镜像仓库分两种:一种是从官方公有仓库拉取:还有就是自己搭建私有仓库.官方的镜像仓库是面对整个应用市场的:私有仓库一般用于公司内部,就是公司项目自身所需的镜像.搭建私有仓库有什么好处?私有 ...

  4. 分享spring、spring boot、spring cloud一些学习资源,从基础知识到项目实战

    1.spring注解驱动开发,学习spring boot和spring cloud必备知识 链接: https://pan.baidu.com/s/1xhULzLlpkERhoMi1G5Lgfg 密码 ...

  5. python json.dumps raise TypeError(repr(o) + " is not JSON serializable") TypeError: 0 is not JSON serializable

    出错如题. 这个问题有可能是因为python的json.dumps没法识别dump内容里的某些数据类型导致的.我的问题是因为dict中含有numpy.int64,numpy.float等类型导致的,需 ...

  6. php 变量的8类类型

    整形,布尔,浮点形,字符串,数组,资源,对象和null php数据类型之查看和判断数据类型 php数据类型之自动转换和强制转换

  7. 011---Djang的cookie和session

    -------------------------------------------------------------cookie与session------------------------- ...

  8. dubbo的rpc异常

    Exception in thread "main" com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method ...

  9. Android 时间计算工具 通用类TimeUtil

    1.整体分析 1.1.源代码如下,可以直接Copy. public class TimeUtil { private static final String TAG = "TimeUtil& ...

  10. 基于CSS多列实现瀑布流

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...