uoj228:基础数据结构练习题
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:基础数据结构练习题的更多相关文章
- uoj228 基础数据结构练习题
趁别人题解没有放出来赶快写一篇 整数序列,操作 区间加 区间变成sqrt(下取整) 区间和 考虑一下对于每个区间里所有sqrt不同的段操作,那么可以在O(段数logn)一次的时间内完成sqrt操作.考 ...
- [UOJ228] 基础数据结构练习题 - 线段树
考虑到一个数开根号 \(loglog\) 次后就会变成1,设某个Node的势能为 \(loglog(maxv-minv)\) ,那么一次根号操作会使得势能下降 \(1\) ,一次加操作最多增加 \(l ...
- 【UOJ228】基础数据结构练习题(线段树)
[UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...
- 【UOJ#228】基础数据结构练习题 线段树
#228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...
- uoj #228. 基础数据结构练习题 线段树
#228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...
- 【线段树】uoj#228. 基础数据结构练习题
get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...
- 【uoj228】 基础数据结构练习题
http://uoj.ac/problem/228 (题目链接) 题意 给出一个序列,维护区间加法,区间开根,区间求和 Solution 线段树.考虑区间开根怎么做.当区间的最大值与最小值相等时,我们 ...
- UOJ228:基础数据结构练习题——题解
http://uoj.ac/problem/228 参考:https://www.cnblogs.com/ljh2000-jump/p/6357583.html 考虑当整个区间的最大值开方==最小值开 ...
- UOJ228 简单数据结构练习题
Description 传送门 维护一个数列, 有以下操作: 对[l,r]同时加上x 把[l,r]开根后下取整. 查询[l,r]之和 n,m \(\leq\)$ 100000, $\(a_i,x \l ...
随机推荐
- (三)Swagger配置多项目共用
重构了多个项目后,在联调接口时,查看api会发现Swagger在几个项目可用,有几个不可用,配置都一样,扫描也充分,那问题出在哪里呢?先仔细找了下Docket的源码,发现有这么个方法: /** * P ...
- html ajax请求 php 下拉 加载更多数据 (也可点击按钮加载更多)
<input type="hidden" class="total_num" id="total" value="{$tot ...
- flask-login原理详解
最近发现项目中使用的flask-login中有些bug,直接使用官网的方式确实可以用,但仅仅是可以用,对于原理或解决问题没有什么帮助,最近通过查看网上资料.分析源码.通过demo.从零开始总结了fla ...
- Can't connect to local MySQL server through socket '/tmp/mysql.sock'
今天在连接mysql的时候出现了上面的错误, 很明显原因找不到/socket 文件 查了半天才发现原来是mysql没有开启 service mysqld start 开启之后在/tmp/目录下回自 ...
- C语言实例解析精粹学习笔记——29
题目: 将字符行内单字之间的空格平均分配插入到单字之间,以实现字符行排版.也就是输入一个英文句子,单词之间的空格数目不同,将这些空格数平均分配到单词之间,重新输出. 代码如下(是原书中配套的代码,只是 ...
- HDU 3364 高斯消元
Lanterns Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- C语言进阶——类型转换04
C语言内可以进行类型转换: 强制类型转换 隐式类型转换 强制类型转换的语法: (tpye)value (type)value_name 强制类型转换的结果: 目标类型可以容纳目标值:结果不变 目标值不 ...
- Spring---资源访问工具类
JDK所提供的访问资源的类并不能很好的满足各种底层资源的访问需求,因此,Spring设计了一个Resource接口,它为应用提供了更强大的访问底层资源的能力 主要方法 boolean exists() ...
- SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID
如题: SDK location not found. Define location with sdk.dir in the local.properties file or with an AND ...
- android gradle 给所有的buildFlavor 的versionName 增加一个后缀
build里面有很多的productFlavors,我想要给所有的productFlavors 的versionName增加一个后缀比如:_20180323 怎么做?注意是所有的productFlav ...