P4145——线段树点修改&&模板题
题目
题意:对一个数列进行以下两种操作:
- 给$[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——线段树点修改&&模板题的更多相关文章
- P1198最大数——线段树点修改&&模板题
题目 题目链接 大意:维护一个数列,有两种操作: 查询操作Q L:查询当前数列中末尾L个数中的最大的数 插入操作A n:将n加上t再对D取模,将所得值插入数列末尾 解决方案 由题意知,只有两种操作 ...
- 【BZOJ 3196】二逼平衡树 线段树套splay 模板题
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...
- codevs 1082 线段树练习3 模板题
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],sum[ ...
- HDU1698:Just a Hook(线段树区域更新模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 Problem Description In the game of DotA, Pudge’s meat ...
- FZU Problem 2171 防守阵地 II (线段树区间更新模板题)
http://acm.fzu.edu.cn/problem.php?pid=2171 成段增减,区间求和.add累加更新的次数. #include <iostream> #include ...
- HDU 1166 敌兵布阵(线段树/树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- E - Just a Hook HDU - 1698 线段树区间修改区间和模版题
题意 给出一段初始化全为1的区间 后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- 线段树(SegmentTree)基础模板
线段树模板题来源:https://www.lintcode.com/problem/segment-tree-build/description 201. 线段树的构造 /** * Definitio ...
随机推荐
- nodejs nvm npm常用命令
---恢复内容开始--- 一行命令搞定node.js 版本升级 node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 首先安装n模块: npm install -g ...
- Spring mybatis源码篇章-动态SQL节点源码深入
通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-动态SQL基础语法以及原理 前话 前文描述到通过mybatis默认的解析驱动类org.apache.ibat ...
- SpringBoot起步
1.SpringBoot依赖包导入 方式一:将spring-boot的依赖为父pom出现 <parent> <groupId>org.springframework.boot& ...
- MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的
MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写.事物A 原子性C 一致性I 隔离性D 持久性高并发的场景下的问题脏读不可重复读幻读事物隔离级别RU读未提交 脏读/不可重复读/幻读 .不适用 ...
- ubuntu 拨号上网
如果没有安装的用户,可以使用 sudo apt-get install pppoe pppoeconf 然后配置上网 sudo pppoeconf 最后,使用 sudo pon dsl-provide ...
- C库函数:scanf、fscanf、printf、fprintf、sprintf、 snprintf
1. scanf 函数原型 int scanf(const char *format, ...); 功能:从标准输入 stdin 读取格式化输入. 2.fscanf 函数原型 int fscanf( ...
- Wannafly挑战赛2D Delete (最短路好题)
大意: 给定DAG, 给定点$S,T$, 每次询问给出点$x$, 求删除$x$后的$S->T$的最短路, 询问之间独立. 删除点$x$的最短路一定要经过一条边$(u,v)$, 满足$u$拓扑序在 ...
- 计算两个坐标点的距离(高德or百度)
/// <summary> /// 获取两个坐标之间的距离 /// </summary> /// <param name="lat1">第一个坐 ...
- 解决低版本IE关于html5新特性的兼容性问题html5shiv.js和Respond.js,以及excanvas.js解决低版本IE不支持canvas的问题
插件:html5shiv.js 让IE9以下版本支持html5新标签,git地址https://github.com/aFarkas/html5shiv 用于解决IE9以下版本浏览器对HTML5新增标 ...
- sql server的循环语句
WITH TEST_CTEAS(SELECT id,position,Parentid,Cast(Parentid AS NVARCHAR(4000)) AS PATHFROM op_client_s ...