uoj#228. 基础数据结构练习题(线段树区间开方)
题目链接:http://uoj.ac/problem/228
代码:(先开个坑在这个地方)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
long long a[N];
struct node{
int l,r;
long long maxx,minn,sum;
long long lazy;
void up(long long val){
maxx+=val;minn+=val;sum+=(r-l+)*1ll*val;
lazy+=val;
}
}tree[*N];
void push_up(int x){
tree[x].maxx=max(tree[x<<].maxx,tree[x<<|].maxx);
tree[x].minn=min(tree[x<<].minn,tree[x<<|].minn);
tree[x].sum=tree[x<<].sum+tree[x<<|].sum;
}
void push_down(int x){
long long val=tree[x].lazy;
if(val){
tree[x<<].up(val);
tree[x<<|].up(val);
tree[x].lazy=;
}
}
void build(int x,int l,int r){
tree[x].l=l; tree[x].r=r;
tree[x].lazy=tree[x].sum=;
if(l==r){
tree[x].minn=tree[x].maxx=tree[x].sum=a[l];
return;
}
int m=(l+r)/;
build(x<<,l,m);
build(x<<|,m+,r);
push_up(x);
}
void updata(int x,int l,int r,long long val){
int L=tree[x].l,R=tree[x].r;
if(l<=L&&R<=r){
tree[x].up(val);return;
}
int m=(L+R)/;
push_down(x);
if(l<=m) updata(x<<,l,r,val);
if(r>m) updata(x<<|,l,r,val);
push_up(x);
}
void Sqrt(int x,int l,int r){
push_down(x);
int L=tree[x].l,R=tree[x].r;
if(l<=L&&R<=r){
if(tree[x].maxx==tree[x].minn){
long long t=(long long)sqrt(tree[x].maxx);
updata(x,L,R,t-tree[x].maxx);
return;
}
else if(tree[x].minn+==tree[x].maxx){
long long t1=(long long)sqrt(tree[x].minn);
long long t2=(long long)sqrt(tree[x].maxx);
if(t1+==t2){
updata(x,L,R,t2-tree[x].maxx);
return;
}
}
}
int m=(L+R)/;
if(l<=m) Sqrt(x<<,l,r);
if(r>m) Sqrt(x<<|,l,r);
push_up(x);
}
long long query(int x,int l,int r){
push_down(x);
int L=tree[x].l,R=tree[x].r;
if(l<=L&&R<=r){
return tree[x].sum;
}
int m=(L+R)/;
long long ans=;
if(l<=m) ans+=query(x<<,l,r);
if(r>m) ans+=query(x<<|,l,r);
push_up(x);
return ans;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
build(,,n);
while(m--){
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op==){
long long val;
scanf("%lld",&val);
updata(,l,r,val);
}
else if(op==){
Sqrt(,l,r);
}
else{
printf("%lld\n",query(,l,r));
}
}
return ;
}
uoj#228. 基础数据结构练习题(线段树区间开方)的更多相关文章
- uoj #228. 基础数据结构练习题 线段树
#228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...
- UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题
题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",st ...
- 【线段树】uoj#228. 基础数据结构练习题
get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...
- 【UOJ#228】基础数据结构练习题 线段树
#228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...
- uoj#228 基础数据结构练习题
题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...
- 【uoj#228】基础数据结构练习题 线段树+均摊分析
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有三种:区间加.区间开根.区间求和. $n,m,a_i\le 100000$ . 题解 线段树+均摊分析 对于原来的两个数 $a$ ...
- uoj#228. 基础数据结构练习题(线段树)
传送门 只有区间加区间开方我都会--然而加在一起我就gg了-- 然后这题的做法就是对于区间加直接打标记,对于区间开方,如果这个区间的最大值等于最小值就直接区间覆盖(据ljh_2000大佬说这个区间覆盖 ...
- UOJ #228 - 基础数据结构练习题(势能线段树+复杂度分析)
题面传送门 神仙题. 乍一看和经典题 花神游历各国有一点像,只不过多了一个区间加操作.不过多了这个区间加操作就无法再像花神游历各国那样暴力开根直到最小值为 \(1\) 为止的做法了,稍微感性理解一下即 ...
- [UOJ228] 基础数据结构练习题 - 线段树
考虑到一个数开根号 \(loglog\) 次后就会变成1,设某个Node的势能为 \(loglog(maxv-minv)\) ,那么一次根号操作会使得势能下降 \(1\) ,一次加操作最多增加 \(l ...
随机推荐
- 8 -- 深入使用Spring -- 7...2 MVC框架与Spring整合的思考
8.7.2 MVC 框架与Spring整合的思考 对于一个基于B/S架构的JAVA EE 应用而言,用户请求总是向MVC框架的控制器请求,而当控制器拦截到用户请求后,必须调用业务逻辑组件来处理用户请求 ...
- 【Ubuntu】Windows 远程桌面连接ubuntu及xrdp的一些小问题(远程桌面闪退、连接失败、tab补全功能,无菜单栏,error - problem connecting )【转】
转:https://blog.csdn.net/u014447845/article/details/80291678 1.远程桌面闪退,shell可以用的问题:(1)需要在该用户目录创建一个.xse ...
- GitLab 使用
命令行界面的基本操作如下,Web界面的操作参考:https://www.cnblogs.com/pzk7788/p/10291378.html [root@localhost ~]$ gitlab-c ...
- Linux下用C获取当前时间
Linux下用C获取当前时间,具体如下: 代码(可以把clock_gettime换成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getNowTime() { ti ...
- Ubuntu下Eclipse的安装方法
1. 下载jre,eclipse,cdt 其中jre是java运行环境,eclipse需要先装jre,才可能运行,cdt是在eclipse中运行c\c++程序的插件. 1.1 下载jre 网址是:ja ...
- 《C++ Primer Plus》16.2 智能指针模板类
智能指针是行为类似于指针的类对象,单这种对象还有其他功能.本节介绍三个可帮助管理动态内存分配的智能指针类.先来看看需要哪些功能以及这些功能是如何实现的.请看下面的函数:void remodel(std ...
- iOS - 代码规范的提示
我们在些程序时会发现苹果里面有好多非常好的提示 比如: 1.每次SDK升级后 一些方法的方法已经过时了,这时候会给你提示描述该方法已经过期(作用:1.兼顾老版本 2.给开发者一个提示) 2.有时候项目 ...
- PHP 简易导出excel 类解决Excel 打开乱码
<?php class exportCsv{ //列名 protected $_column = array(); protected $_reg = array(); public $ret ...
- 【Mybatis】Mybatis元素生命周期
一.SqlSessionFactoryBuilder SqlSessionFactoryBuilder是利用XML或者Java编码获得资源来构建SqlSessionFactory的,通过它可以构建多个 ...
- Android 自动化测试 robotium
转:http://xiaomaozi.blog.51cto.com/925779/908886 Android 的开发可以说已经遍地都是,不说精致的app,只要看些书,看点教学视频,学习二至三个月,都 ...