题面

UOJ

Sol

玄学,不会势能分析

所以

维护区间最大最小值

把开根变成区间减法

如果最大值开根后的变化量和最小值的相等,就直接打个减法\(lazy\)

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
# define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
using namespace std;
typedef long long ll;
const int _(1e5 + 5); IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} int n, m;
struct Segment{
ll mx, mn, tag, sum;
} T[_ << 2]; IL void Build(RG int x, RG int l, RG int r){
if(l == r){
T[x].mn = T[x].mx = T[x].sum = Input();
return;
}
RG int mid = (l + r) >> 1, ls = x << 1, rs = x << 1 | 1;
Build(ls, l, mid), Build(rs, mid + 1, r);
T[x].mn = min(T[ls].mn, T[rs].mn);
T[x].mx = max(T[ls].mx, T[rs].mx);
T[x].sum = T[ls].sum + T[rs].sum;
} IL void Adjust(RG int x, RG ll v, RG int l, RG int r){
T[x].tag += v, T[x].mx += v, T[x].mn += v, T[x].sum += 1LL * (r - l + 1) * v;
} IL void Pushdown(RG int x, RG int l, RG int mid, RG int r){
if(T[x].tag == 0) return;
Adjust(x << 1, T[x].tag, l, mid);
Adjust(x << 1 | 1, T[x].tag, mid + 1, r);
T[x].tag = 0;
} IL void Modify2(RG int x, RG int l, RG int r, RG int L, RG int R, RG ll v){
if(L <= l && R >= r){
Adjust(x, v, l, r);
return;
}
RG int mid = (l + r) >> 1, ls = x << 1, rs = x << 1 | 1;
Pushdown(x, l, mid, r);
if(L <= mid) Modify2(ls, l, mid, L, R, v);
if(R > mid) Modify2(rs, mid + 1, r, L, R, v);
T[x].mn = min(T[ls].mn, T[rs].mn);
T[x].mx = max(T[ls].mx, T[rs].mx);
T[x].sum = T[ls].sum + T[rs].sum;
} IL void Modify1(RG int x, RG int l, RG int r, RG int L, RG int R){
RG ll v1 = sqrt(T[x].mn), v2 = sqrt(T[x].mx);
v1 -= T[x].mn, v2 -= T[x].mx;
if(v1 == v2){
Modify2(x, l, r, L, R, v1);
return;
}
RG int mid = (l + r) >> 1, ls = x << 1, rs = x << 1 | 1;
Pushdown(x, l, mid, r);
if(L <= mid) Modify1(ls, l, mid, L, R);
if(R > mid) Modify1(rs, mid + 1, r, L, R);
T[x].mn = min(T[ls].mn, T[rs].mn);
T[x].mx = max(T[ls].mx, T[rs].mx);
T[x].sum = T[ls].sum + T[rs].sum;
} IL ll Query(RG int x, RG int l, RG int r, RG int L, RG int R){
if(L <= l && R >= r) return T[x].sum;
RG int mid = (l + r) >> 1, ls = x << 1, rs = x << 1 | 1;
RG ll ans = 0;
Pushdown(x, l, mid, r);
if(L <= mid) ans = Query(ls, l, mid, L, R);
if(R > mid) ans += Query(rs, mid + 1, r, L, R);
T[x].mn = min(T[ls].mn, T[rs].mn);
T[x].mx = max(T[ls].mx, T[rs].mx);
T[x].sum = T[ls].sum + T[rs].sum;
return ans;
} int main(RG int argc, RG char *argv[]){
n = Input(), m = Input(), Build(1, 1, n);
while(m--){
RG int op = Input(), l = Input(), r = Input(), v;
if(op == 1) v = Input(), Modify2(1, 1, n, l, r, v);
else if(op == 2) Modify1(1, 1, n, l, r);
else printf("%lld\n", Query(1, 1, n, l, r));
}
return 0;
}

UOJ#288:基础数据结构练习题的更多相关文章

  1. 【线段树】uoj#228. 基础数据结构练习题

    get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...

  2. uoj #228. 基础数据结构练习题 线段树

    #228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...

  3. uoj#228 基础数据结构练习题

    题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...

  4. uoj#228. 基础数据结构练习题(线段树区间开方)

    题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...

  5. uoj#228. 基础数据结构练习题(线段树)

    传送门 只有区间加区间开方我都会--然而加在一起我就gg了-- 然后这题的做法就是对于区间加直接打标记,对于区间开方,如果这个区间的最大值等于最小值就直接区间覆盖(据ljh_2000大佬说这个区间覆盖 ...

  6. UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题

    题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",st ...

  7. UOJ #228 - 基础数据结构练习题(势能线段树+复杂度分析)

    题面传送门 神仙题. 乍一看和经典题 花神游历各国有一点像,只不过多了一个区间加操作.不过多了这个区间加操作就无法再像花神游历各国那样暴力开根直到最小值为 \(1\) 为止的做法了,稍微感性理解一下即 ...

  8. 【UOJ#228】基础数据结构练习题 线段树

    #228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...

  9. 【UOJ228】基础数据结构练习题(线段树)

    [UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...

随机推荐

  1. P3952 时间复杂度

    P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机 ...

  2. c语言数据结构学习心得——二叉树

    二叉树 n(n>=0)个结点的有限集合:(五种形态) 1.或者为空二叉树,n=0: 2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成.左子树和右子树又分别是一棵二叉树. 3.每个 ...

  3. 项目Alpha冲刺 6

    作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 介绍第6天冲刺的项目进展.问题困难和心得体会 1.团队信息 队名:火鸡堂 队 ...

  4. ssh协议git利用ss代理

    前言 不知道ss为何物的绕道 求帐号的绕道 这里只是亲测 ssh协议下的git, 如何判断是什么协议出门左拐 判断是否需要代理 我遇到的问题是: ssh_exchange_identification ...

  5. vue-lazyload图片懒加载的简单使用

    一.vue lazyload插件: 插件地址:https://github.com/hilongjw/vue-lazyload demo:http://hilongjw.github.io/vue-l ...

  6. win10安装ubuntu子系统配置

    # 更改apt源 cat > /etc/apt/sources.list <<'END' #阿里云 deb http://mirrors.aliyun.com/ubuntu/ tru ...

  7. 计算机网络透明网桥算法时间戳c++

    要交CG的兄弟们别抄啊,撞上了严nan谁都不会放过的 好久没写博客了,这次是老师布置的作业,做出来一种,觉得写得很不好,第一种方法把情况都写死在代码里了. 上代码 #include<iostre ...

  8. (转)Http状态码301和302概念简单区别及企业应用案例

    Http状态码301和302的区别及企业应用案例 原文:http://blog.51cto.com/oldboy/1774260 1.什么是301重定向? 301重定向/跳转一般,表示本网页永久性转移 ...

  9. pycharm安装与使用

    python是一门解释性编程语言,所以一般把写python的工具叫解释器.写python脚本的工具很多,小编这里推荐pycharm,是小编用过最好用的一个工具.比较顺手的一个.而且可以跨平台,在mac ...

  10. CSS禁止滚动条

    CSS禁止滚动条的方法: 1.完全隐藏 在<boby>里加入scroll="no",可隐藏滚动条: <boby scroll="no"> ...