[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.线段树介绍 线段树是基于区间的统计查询,线段树是一种 二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.使用线段树可以快速的查 ...
随机推荐
- MySQL基础入门使用和命令的使用
数据库了解 概念 数据库就是一种特殊的文件,其中存储着需要的数据 一个数据库可以有多张表 MySQL是一种关系型数据库 具有关联性数据的就是关系型数据库 MySQL是一种软件可以用来创建mysql数据 ...
- P2256 一中校运会之百米跑
----------------------- 题目链接:MIKU --------------------- 我现在发现找BUG的最好方法————喝水 喝一次找一个,喝两次A道题 --------- ...
- Scout YYF I POJ - 3744【矩阵乘法优化求概率】
题意: 一条路上有 $n$ 个地雷,YYF 从位置 $1$ 出发,走一步的概率为 $p$,走两步的概率是 $(1-p)$.求 YYF 能顺利通过这条路的概率. 数据范围: $1\leq n \leq ...
- Perl-统计文本中各个单词出现的次数(NVDIA2019笔试)
1.原题 2.perl脚本 print "================ Method 1=====================\n"; open IN,'<','an ...
- Lucene搜索引擎入门
一.什么是全文检索? 就是在检索数据,数据的分类: 在计算机当中,比如说存在磁盘的文本文档,HTML页面,Word文档等等...... ...
- linux下ftp(vsftpd)添加用户及设置权限详细步骤
1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test2.建用户:在root用户下:useradd test //增加用户test,并制定test用户的主目录为/hom ...
- JN_0016:查找端口占用
Windows查看端口占用 一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano 可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会 ...
- 【Debian学徒记事】Debian快速呼出Terminal终端
Debian快速呼出Terminal终端 书接上回,Debian已经安装完毕 失踪的Ctrl+Alt+T 安装完毕启动,我发现了剑很诡异的事,Ctrl+Alt+T居然失灵了 (在多次测试后发现,Deb ...
- Python3 基本语法 学习笔记
如何定义python源文件的文件编码 如果想要定义文件代码的编码,一个特殊的注释应该放到源文件的第一或第二行,例如: # coding=<encoding name> 或 使用一种大多数编 ...
- gulp常用插件之gulp-babel使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-babel这是Babel的Gulp插件. 此自述文件适用于gulp-babel v8 + Babel v7检查7.x分支以了解使用Bab ...