题面

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. dcoker做私有仓库

    在官网上拉取私有仓库的镜像.(官网提供的镜像为:registry) docker  pull  registry 启动镜像,并且映射端口.(启动时加-p参数即可) docker -d  -p 5000 ...

  2. [JSOI2018]机器人

    [Luogu4558] [LOJ2550] \(19.3.25\) JSOI2018简要题解 - FallDream 规律就是 对于\(n=m\)我们每一条左下到右上的对角线上的点的走法都是一样的且每 ...

  3. Codeforces - tag::graphs 大合集 [占坑]

    520B 给定初始n和目标m,存在两种操作\(-1\)和\(×2\),要求最少操作次数 无脑解法是BFS,不能解决稍大的规模 当n>m时,输出n-m 否则逆向处理,转换为m到n的最小操作次数,存 ...

  4. HashSet存储过程中如何排除不同的自定义对象?

    HashSet HashSet存储过程中如何排除不同的自定义对象? 先看一个小demo public class Demo1 { public static void main(String[] ar ...

  5. 【Python 解决错误】selenium.common.exception.WebDriverException

    近来准备写个脚本去搜索某端游的官网交易平台.因为也不懂高端的爬虫技术,决定用selenium去戳.这里采用的是chrome浏览器,链接网页时报错: File "C:\Python37\lib ...

  6. 【Excel】数据字典制作

    以下是设计的一种新的数据字典!!! 在Excle中新建2个sheet页,分别是:[主页]与[数据字典] 1.主页内容 E5对应的公式如下:=HYPERLINK("#'数据字典'!C" ...

  7. openerp学习笔记 对象继承,对象初始化数据

    1.对象继承     _inherit = "product.product" 继承产品对象,给产品对象添加字段或方法,不需要设置 _name._table 等属性     注意: ...

  8. JavaScript 函数用途

    在JavaScript中,函数可以:被赋值给一个变量,被赋值为对象的属性.作为参数被传入别的函数.作为函数的结果被返回.用字面量来创建. 1. 赋值给一个变量 //声明一个函数,接受两个参数 func ...

  9. JAVA源码之JDK(二)——Integer、Long、Double

    这篇文章继续java.lang包下的源码学习,笔者也是找了几个比较常用的来阅读.下面针对Integer.Long.Double这样的基本类型的封装类,记录一些比较经典.常用的方法的学习心得,如toSt ...

  10. IdentityServer4授权模式应用场景

    OpenID 和 OAuth 的区别 IdentityServer4,NET Core下的安全框架 客户端模式(Client Credentials) 密码模式(resource owner pass ...