UOJ#288:基础数据结构练习题
题面
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:基础数据结构练习题的更多相关文章
- 【线段树】uoj#228. 基础数据结构练习题
get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...
- uoj #228. 基础数据结构练习题 线段树
#228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...
- uoj#228 基础数据结构练习题
题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...
- uoj#228. 基础数据结构练习题(线段树区间开方)
题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...
- uoj#228. 基础数据结构练习题(线段树)
传送门 只有区间加区间开方我都会--然而加在一起我就gg了-- 然后这题的做法就是对于区间加直接打标记,对于区间开方,如果这个区间的最大值等于最小值就直接区间覆盖(据ljh_2000大佬说这个区间覆盖 ...
- UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题
题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",st ...
- UOJ #228 - 基础数据结构练习题(势能线段树+复杂度分析)
题面传送门 神仙题. 乍一看和经典题 花神游历各国有一点像,只不过多了一个区间加操作.不过多了这个区间加操作就无法再像花神游历各国那样暴力开根直到最小值为 \(1\) 为止的做法了,稍微感性理解一下即 ...
- 【UOJ#228】基础数据结构练习题 线段树
#228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...
- 【UOJ228】基础数据结构练习题(线段树)
[UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...
随机推荐
- css中的block与none
*{ display:none; } div{ display:block; } div 会正常显示粗来吗?不会 因为*代表所有元素,包括div的父级元素html,body 父级元素都不显示了,子元素 ...
- 简单的XMPP服务器与客户端交互
由客户端发起 C: <stream:stream to="localhost" xmlns="jabber:client" xmlns:stream=&q ...
- Machine learning 吴恩达第二周coding作业(必做题)
1.warmUpExercise: function A = warmUpExercise() %WARMUPEXERCISE Example function in octave % A = WAR ...
- 3.2、Factorization Machine实践
1.在上一篇博客中我们构建度为二的因子分解机模型,这篇博客对这个模型进行实践 下图为准备的数据集: 完整代码为: # -*- coding: UTF-8 -*- # date:2018/6/6 # U ...
- 吴裕雄 python 机器学习——K均值聚类KMeans模型
import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...
- Smarty带来的神秘的数字1
问题的引发:在htmly页面通过smarty模板引擎开启session_start()后,突发发现页面无故多了一个 神秘的数字 1 问题界面: 代码: 测试:在session_start()行末加2 ...
- [转] git merge 将多个commit合并为一条之--squash 选项
[FROM] https://blog.csdn.net/themagickeyjianan/article/details/80333645 1.一般的做法(直接git merge) Git相对于C ...
- 获取select标签选中的值
js获取select标签选中的值 var obj = document.getElementById(”testSelect”); var index = obj.selectedIndex; var ...
- Java第四次实训作业
1.编写“电费管理类”及其测试类. 第一步 编写“电费管理”类1)私有属性:上月电表读数.本月电表读数2)构造方法:无参.2个参数3)成员方法:getXXX()方法.setXXX()方法4)成员方法 ...
- oracle client 低于 oracle server 端,导致报错ORA-01882
https://forums.toadworld.com/t/ora-01882-when-i-want-to-view-records-con-dba-scheduler-jobs-toad-10- ...