标题: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 每做完一个操作后,整个序列的和。

  这题暴力肯定可以得一部分的,区间大小最差的情况就是每次都给L=1,R=N,这时暴力肯定不行的,会写线段树的话,可以看出这题也就是单点更新以及总区间查询。而它没说数据范围,但就算是1e18的话,取log对于每个位置的数来说,它最多也就更新个60次左右,所以我们可以加个标记,代表这个区间内还有没有位置需要更新,然后再线段树维护,时间复杂度就是60*nlog(n)这样。

 #include<cstdio>
#include<cmath>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define M(x) ((T[x].l+T[x].r)>>1)
typedef long long ll;
const int N=;
struct Tree{
bool flag;
int l,r;
ll sum;
}T[N<<];
ll a[N];
void built(int id,int l,int r)
{
T[id].l=l;
T[id].r=r;
T[id].sum=;
T[id].flag=false;
if(l==r)
{
T[id].sum=a[l];
T[id].flag=(a[l]>2ll);
return ;
}
built(L(id),l,M(id));
built(R(id),M(id)+,r);
T[id].flag=T[L(id)].flag|T[R(id)].flag;
T[id].sum=T[L(id)].sum+T[R(id)].sum;
}
void modify(int id,int l,int r)
{
if(!T[id].flag)
return ;
if(T[id].l==T[id].r)
{
T[id].sum=(ll)floor(log2(1.0*T[id].sum)+1.0);
T[id].flag=(T[id].sum>2ll);
return ;
}
if(l<=M(id))
modify(L(id),l,r);
if(r>M(id))
modify(R(id),l,r);
T[id].flag=T[L(id)].flag|T[R(id)].flag;
T[id].sum=T[L(id)].sum+T[R(id)].sum;
}
int main()
{
int n,m,l,r;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
built(,,n);
while(m--)
{
scanf("%d%d",&l,&r);
modify(,l,r);
printf("%lld\n",T[].sum);
}
return ;
}

线段树下线段果

  不懂线段树的话,知道stl的map的话,还有种map的写法,思路一样,当某个位置的值<=2时就把它从map删去。

 #include<cstdio>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
map<int,ll> mmp;
map<int,ll>::iterator b,e,temp;
int main()
{
int n,m,l,r;
ll sum=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%lld",&mmp[i]);
sum+=mmp[i];
}
while(m--)
{
scanf("%d%d",&l,&r);
b=mmp.lower_bound(l);
e=mmp.upper_bound(r);
while(b!=e)
{
temp=b;
b++;
sum-=temp->second;
temp->second=(ll)floor(1.0*log2(temp->second)+1.0);
sum+=temp->second;
if(temp->second<=)
mmp.erase(temp);
}
printf("%lld\n",sum);
}
return ;
}

STLwd

最新文章

  1. js实现无限极分类
  2. C++系统预定义4个用于标准数据流对象
  3. 软件工程(FZU2015)助教总结
  4. mongodb 对内嵌文档(数组) group分页查询,并设置查询条件
  5. BZOJ 2565 回文串-Manacher
  6. Codeforces Round #346 (Div. 2)---E. New Reform--- 并查集(或连通图)
  7. nginx入门(安装,启动,关闭,信号量控制)
  8. java jdbc dbcp连接SQL Server
  9. SQL学习_时间函数
  10. tomcat中jsp编译
  11. 简单md5加密
  12. Android中图片的目录
  13. Delphi COM编程技术三类型库(库文件中的工具栏,很全)
  14. 类的父类object的一些属性、方法
  15. 关于Vue修改默认的build文件存放的dist路径
  16. 修改ip导致服务不可用
  17. 第一篇 入门必备 (Android学习笔记)
  18. [代码]--IIS发布网站浏览之后看到的是文件目录 &amp; Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 &amp; App_global.asax.pduxejp_.dll”--“拒绝访问。 ”
  19. [spark 快速大数据分析读书笔记] 第一章 导论
  20. 06: linux中find查找命令总结

热门文章

  1. Photon Server 实现注册与登录(一) --- Hibernate整合到项目中
  2. mysql数据库的 varchar 和 char 的区别
  3. js将阿拉伯数字转换成汉字大写
  4. Spark机器学习API之特征处理(二)
  5. 复选框已经有checked,但是页面没有选中效果(解决)
  6. 切记:永远不要在MySQL中使用UTF-8
  7. 【Day3】项目实战。百度针对Xpath的反爬策略和解决方式
  8. Delphi 执行线程对象
  9. (备忘)Window7下安装Python2.6及Django1.4
  10. 08_Hive中的各种Join操作