题目

链接

题意:对一个数列进行以下两种操作:

  • 给$[l,r]$中的每个数开平方(下取整)
  • 询问$[l,r]$中各个数的和

解决方法

显然,区间开平方不满足区间可加性,所以对区间中每个数开平方不能通过标记完成,只能使用暴力的单点修改。因为1e12的数开方6次就变成了1,所以需要修改的次数实际上很少。同时维护一个区间最大值maxv,如果maxv大于1才需要进行开平方操作。

 #include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = + ;
ll maxv[maxn << ], sum[maxn << ];
int n;
ll a[maxn]; void build(int o, int L, int R)
{
//printf("o:%d L:%d R:%d\n", o, L, R);
int M = L + (R-L) / ;
if(L == R)
{
maxv[o] = a[L];
sum[o] = a[L];
}
else
{
build(*o, L, M);
build(*o+, M+, R);
maxv[o] = max(maxv[*o], maxv[*o+]);
sum[o] = sum[*o] + sum[*o+];
}
} int ql, qr; //查询[ql, qr]中的和
void query(int o,int L,int R, ll& ssum)
{
//printf("o:%d L:%d R:%d\n", o, L, R);
if(ql <= L && R <= qr)
{
//maxx = maxv[o];
ssum = sum[o];
}
else
{
int M = L + (R - L) / ;
//maxx = -INF;
ll lsum =, rsum = ;
if(ql <= M) query(*o, L, M, lsum);
if(qr > M) query(*o+, M+, R, rsum);
//maxx = max(lmax, rmax);
ssum = lsum + rsum; }
} int cl, cr; //修改sqrt(A[cl...cr])
void update(int o, int L, int R)
{
//printf("o:%d L:%d R:%d\n", o, L, R);
if(L == R) //更新叶子结点
{
maxv[o] = (ll)sqrt(maxv[o]);
sum[o] = maxv[o];
}
else
{
int M = L + (R-L)/;
if(cl <= M && maxv[*o] > ) update(*o, L ,M);
if(cr > M && maxv[*o+] > ) update(*o+, M+, R);
maxv[o] = max(maxv[*o], maxv[*o+]); //更新非叶子结点
sum[o] = sum[*o] + sum[*o+];
}
} int main()
{
scanf("%d", &n);
for(int i = ;i <= n;i++) scanf("%lld", &a[i]); build(, , n); int T;
scanf("%d", &T);
while(T--)
{
int order, l, r;
scanf("%d%d%d", &order, &l, &r);
if(l > r) swap(l, r);
if(order == )
{
cl = l; cr = r;
update(, , n);
}
else
{
ll ans = ;
ql = l; qr = r;
query(, , n, ans);
printf("%lld\n", ans);
}
} return ;
}

看讨论区还有分块、树状数组+并查集等做法,Orz.

P4145——线段树点修改&&模板题的更多相关文章

  1. P1198最大数——线段树点修改&&模板题

    题目 题目链接 大意:维护一个数列,有两种操作: 查询操作Q  L:查询当前数列中末尾L个数中的最大的数 插入操作A  n:将n加上t再对D取模,将所得值插入数列末尾 解决方案 由题意知,只有两种操作 ...

  2. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  3. codevs 1082 线段树练习3 模板题

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],sum[ ...

  4. HDU1698:Just a Hook(线段树区域更新模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 Problem Description In the game of DotA, Pudge’s meat ...

  5. FZU Problem 2171 防守阵地 II (线段树区间更新模板题)

    http://acm.fzu.edu.cn/problem.php?pid=2171 成段增减,区间求和.add累加更新的次数. #include <iostream> #include ...

  6. HDU 1166 敌兵布阵(线段树/树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. E - Just a Hook HDU - 1698 线段树区间修改区间和模版题

    题意  给出一段初始化全为1的区间  后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...

  8. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  9. 线段树(SegmentTree)基础模板

    线段树模板题来源:https://www.lintcode.com/problem/segment-tree-build/description 201. 线段树的构造 /** * Definitio ...

随机推荐

  1. nodejs nvm npm常用命令

    ---恢复内容开始--- 一行命令搞定node.js 版本升级 node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 首先安装n模块: npm install -g ...

  2. Spring mybatis源码篇章-动态SQL节点源码深入

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-动态SQL基础语法以及原理 前话 前文描述到通过mybatis默认的解析驱动类org.apache.ibat ...

  3. SpringBoot起步

    1.SpringBoot依赖包导入 方式一:将spring-boot的依赖为父pom出现 <parent> <groupId>org.springframework.boot& ...

  4. MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的

    MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写.事物A 原子性C 一致性I 隔离性D 持久性高并发的场景下的问题脏读不可重复读幻读事物隔离级别RU读未提交 脏读/不可重复读/幻读 .不适用 ...

  5. ubuntu 拨号上网

    如果没有安装的用户,可以使用 sudo apt-get install pppoe pppoeconf 然后配置上网 sudo pppoeconf 最后,使用 sudo pon dsl-provide ...

  6. C库函数:scanf、fscanf、printf、fprintf、sprintf、 snprintf

    1. scanf 函数原型 int scanf(const char *format, ...);  功能:从标准输入 stdin 读取格式化输入. 2.fscanf 函数原型 int fscanf( ...

  7. Wannafly挑战赛2D Delete (最短路好题)

    大意: 给定DAG, 给定点$S,T$, 每次询问给出点$x$, 求删除$x$后的$S->T$的最短路, 询问之间独立. 删除点$x$的最短路一定要经过一条边$(u,v)$, 满足$u$拓扑序在 ...

  8. 计算两个坐标点的距离(高德or百度)

    /// <summary> /// 获取两个坐标之间的距离 /// </summary> /// <param name="lat1">第一个坐 ...

  9. 解决低版本IE关于html5新特性的兼容性问题html5shiv.js和Respond.js,以及excanvas.js解决低版本IE不支持canvas的问题

    插件:html5shiv.js 让IE9以下版本支持html5新标签,git地址https://github.com/aFarkas/html5shiv 用于解决IE9以下版本浏览器对HTML5新增标 ...

  10. sql server的循环语句

    WITH TEST_CTEAS(SELECT id,position,Parentid,Cast(Parentid AS NVARCHAR(4000)) AS PATHFROM op_client_s ...