蓝桥杯Log大侠(线段树单点区间更新)
标题:Log大侠
atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠。
一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力...
变换的规则是: 对其某个子序列的每个整数变为: [log_2 (x) + 1] 其中 [] 表示向下取整,就是对每个数字求以2为底的对数,然后取下整。 例如对序列 3 4 2 操作一次后,这个序列会变成 2 3 2。 drd需要知道,每次这样操作后,序列的和是多少。
【输入格式】 第一行两个正整数 n m 。 第二行 n 个数,表示整数序列,都是正数。 接下来 m 行,每行两个数 L R 表示 atm 这次操作的是区间 [L, R],数列序号从1开始。
【输出格式】 输出 m 行,依次表示 atm 每做完一个操作后,整个序列的和。
例如,
输入:
3 3
5 6 4
1 2
2 3
1 3
程序应该输出:
10
8
6
【数据范围】 对于 30% 的数据, n, m <= 10^3 对于 100% 的数据, n, m <= 10^5
资源约定: 峰值内存消耗 < 256M CPU消耗 < 1000ms
#include"cstdio"
#include"cmath"
#include"algorithm"
using namespace std;
const int MAXN=;
typedef long long LL;
struct node{
int l,r;
LL sum;
}segTree[MAXN*];
int cnt;
void build(int rt,int l,int r)
{
segTree[rt].l=l;
segTree[rt].r=r;
if(l==r)
{
scanf("%lld",&segTree[rt].sum);
if(segTree[rt].sum==)
{
cnt++;//统计数值1的个数 ,方便优化程序
segTree[rt].sum++;//将所有1均变为2,防止1干扰程序优化
}
return ;
}
int mid=(l+r)>>;
build(rt<<,l,mid);
build((rt<<)|,mid+,r);
segTree[rt].sum=segTree[rt<<].sum+segTree[(rt<<)|].sum;
} void update(int rt,int l,int r)
{
if(segTree[rt].sum==*(segTree[rt].r-segTree[rt].l+)) return ;//优化:不超过4轮,不小于2的整数在均变为2 if(segTree[rt].l==segTree[rt].r)
{
segTree[rt].sum=(LL)(log2(segTree[rt].sum*1.0)+);
return ;
} int mid=(segTree[rt].l+segTree[rt].r)>>; if(r<=mid) update(rt<<,l,r);
else if(mid<l) update((rt<<)|,l,r);
else{
update(rt<<,l,mid);
update((rt<<)|,mid+,r);
}
segTree[rt].sum=segTree[rt<<].sum+segTree[(rt<<)|].sum;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
build(,,n);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
update(,x,y);
printf("%lld\n",segTree[].sum-cnt);
}
}
蓝桥杯Log大侠(线段树单点区间更新)的更多相关文章
- 2019hdu多校3 hdu4893(线段树单点 区间更新
补这题主要是因为第三个操作要维护区间,而不是点,否则会T. https://vjudge.net/problem/HDU-4893 题意:输入n.q.表示有n个数,初始化默认这n个数都为零,有q次操作 ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1698:Just a Hook(线段树,区间更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- UVA 12436-Rip Van Winkle's Code(线段树的区间更新)
题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...
- hdu1698线段树的区间更新区间查询
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1556 Color the ball(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...
- zoj3686(线段树的区间更新)
对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a ...
- Color the ball (线段树的区间更新问题)
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
随机推荐
- golang 内存池
一般来说,内存池都是采用预分配的方式,分为固定大小的和非固定大小块,固定大小的内存效率高,非固定大小灵活.同时,分为单线程和多线程版的,单线程不需要考虑并发问题. 一般内存池的实现思想:分配一块比较大 ...
- ECMall验证码问题
一.确认问题: 输入下面这个地址:http://你的网址/index.php?app=captcha&876589486 打开后出现:mt_rand(): max(0) is smaller ...
- UITableView使用指南
本文转载至 http://blog.csdn.net/yu0089/article/details/8227402 一.概述 UITableView是iOS开发比不可少也是最重要的一个控件类.可以说任 ...
- 【BZOJ4240】有趣的家庭菜园 树状数组+贪心
[BZOJ4240]有趣的家庭菜园 Description 对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IO ...
- ptyhon ORM mongoengine
参考资料:http://www.tuicool.com/articles/bMvI7vN from mongoengine import * from datetime import datetime ...
- 【题解】UVA10140 [Prime Distance]
[题解]UVA10140 Prime Distance 哈哈哈哈\(miller-rabbin\)水过去了哈哈哈 还能怎么办呢?\(miller-rabbin\)直接搞.枚举即可,还跑得飞快. 当然此 ...
- Android 破解
一.反编译 默认你的电脑中完好的有java环境 1.下载 Android killer 链接: https://pan.baidu.com/s/1s6lfm8CbdU9ABYEOhdFWxA 提取码 ...
- drawable animation基础
动画配置<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android: ...
- PAT 乙级 1084. 外观数列 (20) 【字符串】
题目链接 https://www.patest.cn/contests/pat-b-practise/1084 思路 用字符串模拟 然后要注意一点 它是连续的 才并在一起 就比如说 d, d1, d1 ...
- margin的相关属性及应用
1.margin常见问题: ①IE6下双边距 (不推荐使用float+margin,可用padding替代) 详见<css浏览器兼容问题集锦>之4.IE6中margin双边距 ②IE6 ...