题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5828

给你n个数,m个操作,操作k,l,r,

k=1时 区间[l,r]每个数加x;

k=2时,区间[l,r]每个数开平方;

k=3时,求区间[l,r]的和。

开方的操作执行的次数,并不多到所以最后会出现很多相同的数,我们可以把相同的数统一减去一个数即可,但是数据中如果存在2 3 2 3 2 3 2 3,有10w次+6,然后开方,这样的话,时间复杂度也是很高的;所以我们可以看到,只要两个数相差一,开方后还相差一,那么我们可以减去一个数完成;

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
#define N 100005
#define met(a, b) memset(a, b, sizeof(a))
#define mod 1000000007
typedef long long LL;
#define Lson r<<1
#define Rson r<<1|1 struct Tree
{
int L, R;
LL lazy, Min, Max, sum;
int mid() { return (L+R)/; }
int len() { return (R-L+); }
}a[N<<]; void BuildTree(int r, int L, int R)
{
a[r].L = L; a[r].R = R; a[r].lazy = ; if(a[r].L == a[r].R)
{
scanf("%I64d", &a[r].sum);
a[r].Max = a[r].Min = a[r].sum;
return ;
} BuildTree(Lson, L, a[r].mid());
BuildTree(Rson, a[r].mid()+, R); a[r].sum = a[Lson].sum + a[Rson].sum;
a[r].Max = max(a[Lson].Max, a[Rson].Max);
a[r].Min = min(a[Lson].Min, a[Rson].Min);
} void Down(int r)
{
a[Lson].lazy += a[r].lazy; a[Rson].lazy += a[r].lazy; a[Lson].sum += a[Lson].len()*a[r].lazy;
a[Rson].sum += a[Rson].len()*a[r].lazy; a[Lson].Max += a[r].lazy; a[Rson].Max += a[r].lazy;
a[Lson].Min += a[r].lazy; a[Rson].Min += a[r].lazy; a[r].lazy = ;
} void Up(int r)
{
a[r].sum = a[Lson].sum + a[Rson].sum; a[r].Max = max(a[Lson].Max, a[Rson].Max);
a[r].Min = min(a[Lson].Min, a[Rson].Min);
} void Update1(int r, int L, int R, LL num)
{
a[r].sum += (R-L+) * num;
if(a[r].L == L && a[r].R == R)
{
a[r].Max += num;
a[r].Min += num;
a[r].lazy += num;
return ;
} Down(r);///往下传递Lazy; if(R <= a[r].mid())
Update1(Lson, L, R, num);
else if(L > a[r].mid())
Update1(Rson, L, R, num);
else
{
Update1(Lson, L, a[r].mid(), num);
Update1(Rson, a[r].mid()+, R, num);
} Up(r);///往上传递Lazy;
}
void Update2(int r, int L, int R)
{
if(a[r].L == L && a[r].R == R)
{
if(a[r].Min == a[r].Max)///当区间内所有的数都相等时,相当于区间内所有数都减去同一个数;
{
LL num = (LL)sqrt(a[r].Max) - a[r].Max;
a[r].sum += a[r].len() * num;
a[r].lazy += num;
a[r].Max += num;
a[r].Min += num; return;
}
else if(a[r].Min + == a[r].Max)///当数之间相差<=1的时候并且开方之后还是相差1的话,那么他们可以通过加一个数得到;
{
LL num1 = (LL)sqrt(a[r].Max);
LL num2 = (LL)sqrt(a[r].Min);
if(num1 == num2+)
{
LL num = num1 - a[r].Max;
a[r].sum += a[r].len() * num;
a[r].lazy += num;
a[r].Max += num;
a[r].Min += num;
return;
}
}
} Down(r); if(R <= a[r].mid())
Update2(Lson, L, R);
else if(L > a[r].mid())
Update2(Rson, L, R);
else
{
Update2(Lson, L, a[r].mid());
Update2(Rson, a[r].mid()+, R);
} Up(r);
}
LL Query(int r, int L, int R)
{
if(L == a[r].L && R == a[r].R)
{
return a[r].sum;
}
Down(r);
if(R <= a[r].mid())
return Query(Lson, L, R);
else if(L > a[r].mid())
return Query(Rson, L, R);
else
{
LL ans1 = Query(Lson, L, a[r].mid());
LL ans2 = Query(Rson, a[r].mid()+, R);
return ans1 + ans2;
}
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, m, op, L, R; LL num; scanf("%d %d", &n, &m); BuildTree(, , n); while(m--)
{
scanf("%d", &op);
if(op == )
{
scanf("%d %d %I64d", &L, &R, &num);
Update1(, L, R, num);
}
else if(op == )
{
scanf("%d %d", &L, &R);
Update2(, L, R);
}
else
{
scanf("%d %d", &L, &R);
LL ans = Query(, L, R);
printf("%I64d\n", ans);
}
}
}
return ;
}

Rikka with Sequence---hdu5828(区间更新与查找 线段树)的更多相关文章

  1. SRM12 T2夏令营(分治优化DP+主席树 (已更新NKlogN)/ 线段树优化DP)

     先写出朴素的DP方程f[i][j]=f[k][j-1]+h[k+1][i] {k<i}(h表示[k+1,j]有几个不同的数)  显然时间空间复杂度都无法承受   仔细想想可以发现对于一个点 i ...

  2. P2075 [NOIP2012T5]借教室 区间更新+二分查找

    P2075 [NOIP2012T5]借教室 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 noip2012-tg 描述 在大学期间,经常需要租借教室.大到院 ...

  3. HDU-4614 Vases and Flowers(线段树区间更新+二分查找)

    http://acm.hdu.edu.cn/showproblem.php?pid=4614 Time Limit: 4000/2000 MS (Java/Others)    Memory Limi ...

  4. HDU 1754 - I Hate It & UVA 12299 - RMQ with Shifts - [单点/区间修改、区间查询线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Time Limit: 9000/3000 MS (Java/Others) Memory Li ...

  5. [NOI2016]区间 题解(决策单调性+线段树优化)

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1593  Solved: 869[Submit][Status][ ...

  6. codedecision P1112 区间连续段 题解 线段树

    题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作 ...

  7. luogu P1712 [NOI2016]区间 贪心 尺取法 线段树 二分

    LINK:区间 没想到尺取法. 先说暴力 可以发现答案一定可以转换到端点处 所以在每个端点从小到大扫描线段就能得到答案 复杂度\(n\cdot m\) 再说我的做法 想到了二分 可以进行二分答案 从左 ...

  8. HihoCoder1070 区间最小值(简单线段树)

    个测试点(输入文件)有且仅有一组测试数据. 每组测试数据的第1行为一个整数N,意义如前文所述. 每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量weigh ...

  9. AcWing:246. 区间最大公约数(线段树 + 增量数组(树状数组) + 差分序列)

    给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d. 2.“Q l r”,表示询问 A[l],A[l ...

随机推荐

  1. 基于github+hexo搭建个人博客(window)

    0x01 环境搭建 1.Node.js环境 下载Node.js安装文件:https://nodejs.org/en/download/ 根据系统选择相应安装包下载,安装过程一路Next,默认设置即可. ...

  2. XSS payload 大全

    收集的一些XSS payload,主要分为五大类,便于查阅. #第一类:Javascript URL <a href="javascript:alert('test')"&g ...

  3. Jsoup(一)-- HelloWorld

    1.简介 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. ...

  4. mybatis 之 parameterType="java.util.List"

    <!-- 添加 --> <insert id="saveBatchMemberRoleConnRepModel" parameterType="java ...

  5. java上传并压缩图片(等比例压缩或者原尺寸压缩)

    本文转载自http://www.voidcn.com/article/p-npjxrbxr-kd.html 先看效果: 原图:1.33M 处理后:27.4kb 关键代码; package codeGe ...

  6. GitHub上整理的一些工具【转载】

    技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...

  7. Promise {<pending>

    场景:在create-react-app whatwg-fetch的项目中,想获取请求返回的数据, componentWillMount() { console.log(this.props) con ...

  8. MySQL优化之SQL耗时瓶颈 SHOW profiles

    1.首先查看是否开启profiling功能 SHOW VARIABLES LIKE '%pro%'; 或者 SELECT @@profiling; 2.开启profiling SET profilin ...

  9. Struts2之命名空间与Action的三种创建方式

    看到上面的标题,相信大家已经知道我们接下来要探讨的知识了,一共两点:1.package命名空间设置:2.三种Action的创建方式.下面我们开始本篇的内容: 首先我们聊一聊命名空间的知识,namesp ...

  10. kafka 的quick start(windows平台)

    h1, h2, h3, h4, h5, h6, p, blockquote { margin: 5px; padding: 5; } body { font-family: "Helveti ...