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 ...
随机推荐
- Java网络编程-你是GG还是MM?
第六阶段 网络编程 每一台计算机通过网络连接起来,达到了数据互动的效果,而网络编程所解决的问题就是如何让程序与程序之间实现数据的通讯与互动 在吗?你是GG还是MM? (一) 网络模型概述 (1) 两大 ...
- AndroidStudio布局编辑器强制刷新布局界面
用AndroidStudio布局编辑器编辑界面的时候,在selector里调整按钮的颜色,调整后的颜色经常无法实时显示在布局编辑器里,每次都重新运行程序查看界面又非常麻烦和低效,可以用以下方法解决: ...
- icell更改用户管理员
管理员页面是http://127.0.0.1:8080/PORTAL/tsysLoginController/admin超级管理员是http://127.0.0.1:8080/PORTAL/tsysL ...
- Codeforces contest 1277 E. Beautiful Rectangle
- 【静态延迟加载】self关键字和static关键字的区别
先来看下代码,从代码中发现问题.解决问题 //先实现一个手机工厂类 class Phone{ public static function setBrand(){ echo "Main Ph ...
- spark机器学一Mllib 数据抽象
spark 提供了两个机器学习库 MLlib 和 ML,MLlib 是 spark 第一个机器学习库,相比于 ML,它更加成熟 rdd 是 spark core 的数据抽象,dataframe 是 s ...
- MySQL 聚合函数(三)MySQL对GROUP BY的处理
原文来自MySQL 5.7 官方手册:12.20.3 MySQL Handling of GROUP BY SQL-92和更早版本不允许SELECT列表,HAVING条件或ORDER BY列表引用未在 ...
- docker使用的一些需要注意事项
1.程序需要前台运行 程序必须前台执行,如果是java进程的话 不要有nohup 或者使用service的方式进行后台运行 否则可能会出现频繁启动应用的问题 原因就是docker只能管理运行中的 ...
- 浅谈后缀数组SA
这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求Suffix ...
- hdu 6053 trick gcd 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意:给定一个数组,我们定义一个新的数组b满足bi<ai 求满足gcd(b1,b2....bn)&g ...