[UOJ228] 基础数据结构练习题 - 线段树
考虑到一个数开根号 \(loglog\) 次后就会变成1,设某个Node的势能为 \(loglog(maxv-minv)\) ,那么一次根号操作会使得势能下降 \(1\) ,一次加操作最多增加 \(logloga\) 的势能。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 400005;
ll sum[N],mx[N],mn[N],tag[N],src[N];
void add(ll p,ll l,ll r,ll v)
{
sum[p]+=v*(r-l+1);
mx[p]+=v;
mn[p]+=v;
tag[p]+=v;
}
void pushup(int p)
{
sum[p]=sum[p*2]+sum[p*2+1];
mx[p]=max(mx[p*2],mx[p*2+1]);
mn[p]=min(mn[p*2],mn[p*2+1]);
}
void pushdown(int p,int l,int r)
{
if(tag[p])
{
add(p*2,l,(l+r)/2,tag[p]);
add(p*2+1,(l+r)/2+1,r,tag[p]);
tag[p]=0;
}
}
void build(int p,int l,int r)
{
if(l==r)
{
sum[p]=mx[p]=mn[p]=src[l];
}
else
{
build(p*2,l,(l+r)/2);
build(p*2+1,(l+r)/2+1,r);
pushup(p);
}
}
void modify(int p,int l,int r,int ql,int qr,int v)
{
if(l>qr||r<ql) return;
if(l>=ql&&r<=qr)
{
add(p,l,r,v);
}
else
{
pushdown(p,l,r);
modify(p*2,l,(l+r)/2,ql,qr,v);
modify(p*2+1,(l+r)/2+1,r,ql,qr,v);
pushup(p);
}
}
void change(int p,int l,int r,int ql,int qr)
{
if(l>qr||r<ql) return;
if(l>=ql&&r<=qr && mx[p]-(ll)sqrt(mx[p]) == mn[p]-(ll)sqrt(mn[p]))
{
add(p,l,r,(ll)sqrt(mx[p])-mx[p]);
}
else
{
pushdown(p,l,r);
change(p*2,l,(l+r)/2,ql,qr);
change(p*2+1,(l+r)/2+1,r,ql,qr);
pushup(p);
}
}
ll query(int p,int l,int r,int ql,int qr)
{
if(l>qr||r<ql) return 0;
if(l>=ql&&r<=qr)
{
return sum[p];
}
else
{
pushdown(p,l,r);
return query(p*2,l,(l+r)/2,ql,qr) + query(p*2+1,(l+r)/2+1,r,ql,qr);
}
}
int main()
{
ios::sync_with_stdio(false);
int n,m,t1,t2,t3,t4;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>src[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>t1>>t2>>t3;
if(t1==1)
{
cin>>t4;
modify(1,1,n,t2,t3,t4);
}
if(t1==2)
{
change(1,1,n,t2,t3);
}
if(t1==3)
{
cout<<query(1,1,n,t2,t3)<<endl;
}
}
}
[UOJ228] 基础数据结构练习题 - 线段树的更多相关文章
- 【UOJ#228】基础数据结构练习题 线段树
#228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...
- uoj #228. 基础数据结构练习题 线段树
#228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...
- 【uoj#228】基础数据结构练习题 线段树+均摊分析
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有三种:区间加.区间开根.区间求和. $n,m,a_i\le 100000$ . 题解 线段树+均摊分析 对于原来的两个数 $a$ ...
- uoj#228. 基础数据结构练习题(线段树区间开方)
题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...
- UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题
题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",st ...
- uoj228 基础数据结构练习题
趁别人题解没有放出来赶快写一篇 整数序列,操作 区间加 区间变成sqrt(下取整) 区间和 考虑一下对于每个区间里所有sqrt不同的段操作,那么可以在O(段数logn)一次的时间内完成sqrt操作.考 ...
- 【UOJ228】基础数据结构练习题(线段树)
[UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...
- 【线段树】uoj#228. 基础数据结构练习题
get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...
- 数据结构-PHP 线段树的实现
转: 数据结构-PHP 线段树的实现 1.线段树介绍 线段树是基于区间的统计查询,线段树是一种 二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.使用线段树可以快速的查 ...
随机推荐
- Selenium实战(七)——自动发送邮件
SMPT(Simple Mail Transfer Protocol)简单邮件传输协议,是一组由源地址到目的地址传送邮件的规则,可以控制信件的中转方式.Python的smptlib模块提供了简单的AP ...
- Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...
- Python中not、and、or的优先级
优先级:not > and > or 1.not与紧跟其后的那个条件是不可分割的2.如果条件语句全部由纯and.或纯or链接,按照从左到右的顺序依次计算即可 print(True and ...
- python下timer定时器常用的两种实现方法
方法一,使用线程中现成的: 这种一般比较常用,特别是在线程中的使用方法,下面是一个例子能够很清楚的说明它的具体使用方法: #! /usr/bin/python3 #! -*- conding: u ...
- c++编程之内存模型
我们在编程的时候,无可避免要申明变量,在这个变量可以是在()中,可以在{}中,也可以直接在外面,也可以用new的方式.那么当我们在申明变量的时候,实质上我们所做的工作是:关联了一个内存模型! 上代码: ...
- ZViZbsPBdS
第一步:请在下方输入框中输入你要搬家的博客个人主页地址,需要注意格式: SegmentFault:https://segmentfault.com/u/xxxx 掘金:https://juejin.i ...
- 【spring boot】SpringBoot初学(3)– application配置和profile隔离配置
前言 github: https://github.com/vergilyn/SpringBootDemo 说明:我代码的结构是用profile来区分/激活要加载的配置,从而在一个project中写各 ...
- 【spring】spring源码阅读之xml读取、bean注入(BeanFactory)
前言 此源码其实是在4月中旬就看了,而且当初也写了一份word文档,但不打算直接把word发上来.还是跟着以前的笔记.跟踪代码边看边写吧. 其实当初看源码的理由很简单,1.才进新公司,比较有空闲.2. ...
- Aspcms标签大全及常用标签
相关解释:1.首页指的是index.html文件.列表页一般指newslist.html,productlist.html等文件,该文件对应于后台栏目添加或修改时的列表模板.内页一般指news.htm ...
- gulp常用插件之bower使用
更多gulp常用插件使用请访问:gulp常用插件汇总 bower这是一款客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源. 更多使用文档请点击访 ...