题面

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. [转]iOS系列译文:深入理解 CocoaPods

    Cocoapods是 OS X 和 iOS 下的一个第三方库管理工具.你能使用CocoaPods添加被称作“Pods”的依赖库,并轻松管理它们的版本,而不用考虑当前的时间和开发环境. Cocoapod ...

  2. Eclipse Java SE升级Java EE

    网上教程大多是提供了“http://download.eclipse.org/releases/ganymede/”地址,但是实际更新过程中会报错. 大致查询了一下,很可能是版本不匹配的问题,正确的更 ...

  3. thinkphp3.2----实现伪静态和路由配置

    URL模式: 0.普通   http://localhost/qixin/ThinkCMF(test)_backup/index.php?g=user&m=login&a=index ...

  4. c++11 enable_shared_from_this

    本质的原因:raw data和引用计数的管理块,可能是分开的 使用场景: 需要在对象中得到shared ptr,  错误的代码:直接构造新的shared_ptr<A>对象,两个shared ...

  5. 查看已安装tensorflow版本以及安装路径

    查看版本: import tensorflow as tf tf.__version__ 查看安装路径: tf.__path__

  6. python全栈开发_day7_字符编码,以及文件的基本读取

    一:字符编码 1)什么是字符编码 将人能识别的字符等高级标识符与计算机所能识别的二进制01进行转化,这之间的交流需要一个媒介,进行两种标识符之间的转化. 字节的存储方式为八个二进制位 2)乱码 存放数 ...

  7. PHP的curl实现get,post 和 cookie (转)

    类似于dreamhost这类主机服务商,是显示fopen的使用 的.使用php的curl可以实现支持FTP.FTPS.HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE ...

  8. sizeof(数组名) 与 数组长度

    int a[] = {1, 2, 3, 4}; cout << sizeof(a); //16 char b[] = "abc"; cout << size ...

  9. Nearest Common Ancestors(LCA板子)

    题目链接:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 1000 ...

  10. Go语言包管理工具Glide

      Go语言包管理工具用于管理Go项目的库和库的依赖引用. 包管理工具普遍会在Go项目根目录生成Vendor文件夹并自动下载该Go项目需要的库. Go语言有很多开源的包管理工具,这里主要介绍Glide ...