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 ...
随机推荐
- spring-JDBC Template
JDBC Template概念 为简化持久化操作,spring在JDBC API之上提供JDBC Template组件 提供统一模板: 环境配置 1.创建MySQL数据库 2.搭建maven项目,并引 ...
- 死锁-Java代码示例
class MyThread implements Runnable{ private Object o1 = new Object(); private Object o2 = new Object ...
- thinkPHP5.0 save和saveAll,新增和更新的问题
今天遇到一个问题,在模型中使用save保存数据之后,使用saveAll继续新增数据,结果报 缺少更新条件,网上搜了下发现一篇文章https://www.jianshu.com/p/1848f61de6 ...
- 深入理解PHP数组函数和预定义接口
一. PHP对数组的过滤 函数: array_filter(p1[,p2]) 参数p1是要过滤的数组,参数p2是自定义过滤会掉函数(可以是匿名函数) 例子: <?php $arr = ['',n ...
- python+scrapy环境搭建步骤描述
Python3(3.5.4)搭建爬虫系统步骤描述: 1.下载python安装包,路径:https://www.python.org/downloads/windows/ 选择3.5.4版本64位的安 ...
- Snowflake Snow Snowflakes【Poj3349】
Description You may have heard that no two snowflakes are alike. Your task is to write a program to ...
- 笔记-python-元类metaclass
笔记-python-元类metaclass 1. 元类 1.1. 类也是对象 class Person(object): pass 上面的代码会在内存中创建一个类,它也是对象, 可以将 ...
- Android 使用Retrofit2.0+OkHttp3.0实现缓存处理+Cookie持久化第三方库
1.Retrofit+OkHttp的缓存机制 1.1.第一点 在响应请求之后在 data/data/<包名>/cache 下建立一个response 文件夹,保存缓存数据. 1.2.第二点 ...
- sql server inser相关处理(添加一条,一次添加多条,Bulk插入多条)
1,insert语句 insert into 表一(字段一,字段二,字段三) value(值一,值二,值三) 2,sql 插入多条语句,其中完整值之间用逗号分割 insert into 表一(字段一, ...
- Jsoncpp 编译
1. linux下编译jsoncpp 从(http://jsoncpp.sourceforge.net/)下载源码包“jsoncpp-src-0.5.0.tar.gz”,解压后在其解压后目录中运行 $ ...