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大佬说这个区间覆盖 ...
随机推荐
- IDEA无法导入HttpServlet包解决方法
1.maven项目 直接在pom.xml中添加对java servlet api的依赖即可,比较常用的一个servlet版本3.1.0的依赖如下: <!-- https://mvnreposit ...
- junper防火墙之自摆乌龙
Juniper防火墙划分三个端口: 1.E0/0连接内网网络,网段是172.16.1.0/24,E0/0的端口ip地址是172.16.1.1,作为内网网络的网关 2.E0/1连接DMZ区域,网段是17 ...
- LTUI v1.1, 一个基于lua的跨平台字符终端UI界面库
简介 LTUI是一个基于lua的跨平台字符终端UI界面库. 此框架源于xmake中图形化菜单配置的需求,类似linux kernel的menuconf去配置编译参数,因此基于curses和lua实现了 ...
- UVA 11354 Bond 最小生成树 + lca
题意 给出一张图,q个询问,每次询问给出uv,找出一条路径,使这条路径上的最大边权是两点所有路径中最小,输出这个值 思路 很显然要先求出最小生成树,任意两点在最小生成树上有唯一路径,并且这条路径上的最 ...
- dajngo ORM查询中select_related的作用,博客主题的定制,从数据库中按照年月筛选时间
1.dajngo ORM查询中select_related的作用 select_related()方法一次性的把数据库关联的对象都查询出来放入对象中,再次查询时就不需要再连接数据库,节省了后面查询数据 ...
- vue项目引入外部字体
1.UI设计图有"华文黑体",担心客户端没有该字体,将"huawen.ttf"字体文件,放入项目中: 2.创建一个font.scss(或font.css)文件: ...
- 自动化部署三剑客 gitlab + ansible + jenkins
http://www.showerlee.com/archives/1880 https://edu.51cto.com/center/course/lesson/index?id=280700 Gi ...
- python二维码模块(qrcode)
qrcode模块安装 运行命令行工具(cmd),使用pip安装工具分别安装qrcode. pip install qrcode 先来个简单的例子 import qrcode # 二维码内容 data ...
- 下载xlsx文件打开一直提示文件已损坏
这是office受保护视图导致的原因所造成的,按照以下操作,问题就不是问题了 解决办法如下: 1.在打开excel2018数据表格时,出现提示“文件已损坏,无法打开”,点击确定按钮 2.进入空白程序界 ...
- 洛谷 P1896 [SCOI2005]互不侵犯 (状态压缩DP)
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...