UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题
一个数被开方
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 300003
#define ll long long
using namespace std;
int n,m;
ll mx[maxn<<2],mn[maxn<<2],arr[maxn],sum[maxn<<2],lazy[maxn<<2];
void pushup(int now,int l,int r)
{
int mid=(l+r)>>1;
mn[now]=mn[now<<1], mx[now]=mx[now<<1], sum[now]=sum[now<<1];
if(r>mid)
mn[now]=min(mn[now], mn[(now<<1)|1]), mx[now]=max(mx[now], mx[(now<<1)|1]), sum[now]+=sum[(now<<1)|1];
}
void mark(int l,int r,int now,ll delta)
{
mx[now]+=delta,mn[now]+=delta,lazy[now]+=delta, sum[now]+=1ll*(r-l+1)*delta;
}
void pushdown(int l,int r,int now)
{
if(lazy[now])
{
int mid=(l+r)>>1;
if(mid>=l) mark(l,mid,now<<1,lazy[now]);
if(r>mid) mark(mid+1,r,(now<<1)|1,lazy[now]);
lazy[now]=0;
}
}
void build(int l,int r,int now)
{
if(l==r)
{
mn[now]=mx[now]=sum[now]=arr[l];
return;
}
int mid=(l+r)>>1;
if(l<=mid) build(l,mid,now<<1);
if(r>mid ) build(mid+1,r,(now<<1)|1);
pushup(now,l,r);
}
void change(int l,int r,int now,int L,int R,ll delta)
{
if(l>=L&&r<=R)
{
mark(l,r,now,delta);
return;
}
pushdown(l,r,now);
int mid=(l+r)>>1;
if(L<=mid) change(l,mid,now<<1,L,R,delta);
if(R>mid) change(mid+1,r,(now<<1)|1,L,R,delta);
pushup(now,l,r);
}
void update(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R&&(ll)(mx[now]-(ll)sqrt(mx[now])) == (ll)(mn[now]-(ll)sqrt(mn[now])))
{
mark(l,r,now,(ll)((ll)sqrt(mx[now])-mx[now]));
return;
}
pushdown(l,r,now);
int mid=(l+r)>>1;
if(L<=mid)update(l,mid,(now<<1),L,R);
if(R>mid) update(mid+1,r,(now<<1)|1,L,R);
pushup(now,l,r);
}
long long query(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R) return sum[now];
pushdown(l,r,now);
int mid=(l+r)>>1;
ll tmp=0;
if(L<=mid) tmp+=query(l,mid,now<<1,L,R);
if(R>mid) tmp+=query(mid+1,r,(now<<1)|1,L,R);
return tmp;
}
int main()
{
// setIO("input");
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%lld",&arr[i]);
build(1,n,1);
for(int i=1;i<=m;++i)
{
int opt,l,r;
ll x;
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d%lld",&l,&r,&x);
change(1,n,1,l,r,x);
}
if(opt==2)
{
scanf("%d%d",&l,&r);
update(1,n,1,l,r);
}
if(opt==3)
{
scanf("%d%d",&l,&r);
printf("%lld\n",query(1,n,1,l,r));
}
}
return 0;
}
UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题的更多相关文章
- 【uoj#228】基础数据结构练习题 线段树+均摊分析
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有三种:区间加.区间开根.区间求和. $n,m,a_i\le 100000$ . 题解 线段树+均摊分析 对于原来的两个数 $a$ ...
- uoj #228. 基础数据结构练习题 线段树
#228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...
- uoj#228. 基础数据结构练习题(线段树区间开方)
题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...
- 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...
- 【线段树】uoj#228. 基础数据结构练习题
get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...
- 【UOJ#228】基础数据结构练习题 线段树
#228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...
- uoj#228 基础数据结构练习题
题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...
- bzoj4127 Abs 树链剖分+线段树+均摊分析
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4127 题解 首先区间绝对值和可以转化为 \(2\) 倍的区间正数和 \(-\) 区间和.于是问 ...
- uoj#228. 基础数据结构练习题(线段树)
传送门 只有区间加区间开方我都会--然而加在一起我就gg了-- 然后这题的做法就是对于区间加直接打标记,对于区间开方,如果这个区间的最大值等于最小值就直接区间覆盖(据ljh_2000大佬说这个区间覆盖 ...
随机推荐
- text获取元素的文本
1断言 代码 # -*-coding:utf-8-*-from selenium import webdriverimport time as tdriver = webdriver.Chrome() ...
- Django 过滤器 、日期格式化、数学运算
Django 的模板中的数学运算前言 django模板只提供了加法的filter,没有提供专门的乘法和除法运算:django提供了widthratio的tag用来计算比率,可以变相用于乘法和除法的计算 ...
- 20191128 Spring Boot官方文档学习(9.10)
9.10.数据库初始化 可以使用不同的方式初始化SQL数据库,具体取决于堆栈是什么.当然,如果数据库是一个单独的进程,您也可以手动执行.建议使用单一机制进行模式生成. 9.10.1.使用JPA初始化数 ...
- HashMap源码分析-jdk1.7
注:转载请注明出处!!!!!!!这里咱们看的是JDK1.7版本的HashMap 学习HashMap前先知道熟悉运算符合 *左移 << :就是该数对应二进制码整体左移,左边超出的部分舍弃,右 ...
- 【转】sql server数据收集和监控
转自:https://www.cnblogs.com/zhijianliutang/p/4476403.html 相关系列: https://www.cnblogs.com/zhijianliutan ...
- Sql server 执行计划详解
序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博 ...
- faker数据填充详解
安装 在laravel中已经自动集成,无需手动安装.如需在其他地方使用,可使用以下命令进行安装. composer require fzaninotto/faker 为Faker指定中文支持 可通过在 ...
- [ERROR] Plugin org.apache.maven.plugins:maven-clean-plugin:2.5 or one of its dependencies could not be resolved: Cannot access nexus-aliyun (http://maven.aliyun.com/nexus/content/groups/public) in off
这个错误是将work offline打勾引起的. 这个是离线工作模式,相当于断网,远程的jar会拉不下来.
- C语言--一维数组,字符数组
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zuoyou1314/article/details/30799519 watermark/2/tex ...
- SQL执行计划之sql_trace
一,sql_trace的作用:用以描述SQL的执行过程的trace输出. - SQL是如何操作数据的 - SQL执行过程中产生了哪些等待事件 - SQL执行中消耗了多少资 ...