http://uoj.ac/problem/228

参考:https://www.cnblogs.com/ljh2000-jump/p/6357583.html

考虑当整个区间的最大值开方==最小值开方(实质上就是区间开完方后所有数都相等),那么我们开一次方就可以了。

听说有证明如果达到上面的那种情况的话最多需要操作O(lg^2)次,那么复杂度就是O(n*lg^3)了。

实际上开方只是起到了一个缩小最大值和最小值差值的作用,当差值缩小为0时就是我们所想要的那种情况。

但是也有极端数据比如898989,开完方变成343434……无限下去你就会发现无论怎么开所有的数都会差1,复杂度瞬间被艹。

对于这种极端数据实际上只是进行了一次区间减,我们特判之就能保证复杂度了。

另外为了减少代码编写难度,采用了参考的那种只有当最大值==最小值才开方的写法,虽然最好情况下复杂度会增加,但是最坏情况复杂度并没有增加,所以没有问题。

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5;
inline ll read(){ll X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
int n,m;
ll b[N],sum[N*4],ad[N*4],maxn[N*4],minn[N*4];
inline void mdy(int a,int l,int r,ll w){sum[a]+=w*(r-l+1);maxn[a]+=w;minn[a]+=w;ad[a]+=w;
}
inline void upt(int a,int l,int r){int ls=a<<1,rs=a<<1|1;sum[a]=sum[ls]+sum[rs]+ad[a]*(r-l+1);maxn[a]=max(maxn[ls],maxn[rs])+ad[a];minn[a]=min(minn[ls],minn[rs])+ad[a];
}
void build(int a,int l,int r){if(l==r){sum[a]=maxn[a]=minn[a]=b[l];return;}int mid=(l+r)>>1;build(a<<1,l,mid);build(a<<1|1,mid+1,r);upt(a,l,r);
}
void seg_add(int a,int l,int r,int l1,int r1,ll w){if(r<l1||r1<l)return;if(l1<=l&&r<=r1){mdy(a,l,r,w);return;}int mid=(l+r)>>1;seg_add(a<<1,l,mid,l1,r1,w);seg_add(a<<1|1,mid+1,r,l1,r1,w);upt(a,l,r);
}
void seg_sqrt(int a,int l,int r,int l1,int r1,ll w){if(r<l1||r1<l)return;if(l1<=l&&r<=r1){ll delta,c1=sqrt(minn[a]+w),c2=sqrt(maxn[a]+w);if(maxn[a]==minn[a]){delta=minn[a]+w-(ll)sqrt(minn[a]+w);mdy(a,l,r,-delta);return;}else if(minn[a]+1==maxn[a]&&c1+1==c2){delta=minn[a]+w-(ll)sqrt(minn[a]+w);mdy(a,l,r,-delta);return;}}int mid=(l+r)>>1;w+=ad[a];seg_sqrt(a<<1,l,mid,l1,r1,w);seg_sqrt(a<<1|1,mid+1,r,l1,r1,w);upt(a,l,r);
}
ll query(int a,int l,int r,int l1,int r1,ll w){if(r<l1||r1<l)return 0;if(l1<=l&&r<=r1)return sum[a]+w*(r-l+1);int mid=(l+r)>>1;w+=ad[a];return query(a<<1,l,mid,l1,r1,w)+query(a<<1|1,mid+1,r,l1,r1,w);
}
int main(){n=read(),m=read();for(int i=1;i<=n;i++)b[i]=read();build(1,1,n);while(m--){int op=read(),x=read(),y=read();if(op==1)seg_add(1,1,n,x,y,read());if(op==2)seg_sqrt(1,1,n,x,y,0);if(op==3)printf("%lld\n",query(1,1,n,x,y,0));}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9154111.html

UOJ228:基础数据结构练习题——题解相关推荐

  1. 【UOJ#228】 基础数据结构练习题

    题目描述 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一个长度为 n ...

  2. C++3.4数据结构之队列基础+blah数集题解

    C++3.4数据结构之队列基础+blah数集题解 队列(queue)是一种限定在一端进行插入,另一端删除的特殊线性表 . 就像排队买东西一样, 队列的出队就像排在前面的人买完东西后离开(删除). 队列 ...

  3. 哪里能练计算机基础知识题库,计算机基础知识练习题集锦.doc

    计算机基础知识练习题集锦.doc (22页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 24.9 积分 计算机基础知识练习题集锦全国计算机一级等级考试选 ...

  4. 计算机一级选择题必背基础知识,计算机一级考试基础知识练习题(三)

    计算机一级考试基础知识练习题(三) 一.单选题 1.第一台电子数字计算机的运算速度为每秒______. A:500000次 B:50000次 C:5000次 D:500次 答案: C 2.计算机可分为 ...

  5. 暑期集训2:ACM基础算法 练习题G:POJ - 1298

    2018学校暑期集训第二天--ACM基础算法 练习题G  --  POJ - 1298 The Hardest Problem Ever Julius Caesar lived in a time o ...

  6. 暑期集训2:ACM基础算法 练习题C:CF-1008A

    2018学校暑期集训第二天--ACM基础算法 练习题A  --   CodeForces - 1008A Romaji Vitya has just started learning Berlanes ...

  7. 暑期集训2:ACM基础算法 练习题B:CF-1008B

    2018学校暑期集训第二天--ACM基础算法 练习题B  --   CodeForces - 1008B Turn the Rectangles There are nn rectangles in ...

  8. 暑期集训2:ACM基础算法 练习题A:CF-1008C

    2018学校暑期集训第二天--ACM基础算法 练习题A  --  CodeForces - 1008C Reorder the Array You are given an array of inte ...

  9. 第一章c语言基础知识答案,第一章 C语言的基础知识练习题

    第一章 C语言的基础知识练习题 第一章 C语言的基础知识 第一节 对C语言的初步认识 习题 1. 下列叙述中错误的是 B A)任何一个C程序都必须有且仅有一个main函数,C语言总是从main函数开始 ...

最新文章

  1. linux 自学系列:wc命令
  2. python数据特征提取_训练数据的特征提取
  3. 在C4C UI里嵌入CRM WebClient UI
  4. 如何在Windows 10上使用Microsoft Defender扫描文件或文件夹中的恶意软件
  5. android远程命令行工具,Android 使用 adb命令 远程安装apk
  6. call和apply;this;闭包
  7. 在java中对字符串的一些实现处理
  8. myibatis 报错 Could not find result map java.util.HashMap
  9. 用JS判断浏览器是否是IE9以下,处理可能遇到的兼容性问题,或者给出浏览器版本过低的升级提醒。
  10. 5G WIFI DFS介绍
  11. AD学习笔记(二)原理图库以及原理图绘制
  12. animation unity 速度_Unity中用Timeline实现动画特写(上)
  13. 《杀生》,胡说一下电影与思考
  14. javascript系列-class6.String类型
  15. Java方法和数组练习
  16. socket编程之read()/write()
  17. Heartbleed心脏出血漏洞靶场搭建
  18. 使用esp8266 wifi芯片和DFRduino开发板(Arduino也可以),向自己的服务器发送请求(尽可能详细的说明)
  19. JavaScript重点知识点大全整理,必备!
  20. html弹窗隐藏,js弹窗window.open 隐藏地址栏的问题location

热门文章

  1. TCP三次握手和四次挥手图示
  2. ztree 自定义参数_zTree树插件使用方法及自定义控件实践_蓝戒的博客
  3. centos7+ docker1.12 实践部署docker及配置direct_lvm
  4. 《MySQL DBA修炼之道》——2.3 其他MySQL分支的安装
  5. insert into 多条数据_最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)
  6. MODE —— 输出一个高度和宽度固定的方框(知识点:for循环嵌套for循环)
  7. 运维自动化------ansible搭建
  8. Python 【第十三章】 Django 之 FORM
  9. Qt 汽车仪表再次编写,Widget,仪表显示,绘制界面
  10. Subsonic使用中