传送门:http://codeforces.com/contest/679/problem/E

题目意思很清晰,给你一个序列,要求你完成以下三个操作:

1.输出A[i]

2.将[a,b]区间的所有数字变成c

3.将[a,b]区间的每个数加上c,若此时区间内有42的整次幂(1,42,422,423,424...),则一直进行此操作,直到区间内没有这类数;

正解:

线段树拓展题目;

先不考虑操作2,只考虑操作3;

我可以给每个数字设置一个等级,即处在(1,42)的数1级,(42,422)的数2级,以此类推,再记录每个数与它最近的大于它的42的整次幂的距离;

用线段树记录区间最大值,一旦最大值大于0,对线段树向下走,暴力升级,即哪里的最大值大于0,就去哪里升级,由于指数上升很快,每个数最多被升级log42(数值范围)次;

再考虑操作2,操作2会将一整个区间变成一个数,这时如果暴力升级可能会被卡掉,不如在线段树里记录一下,这段区间的数是否相同,如果相同,对整段区间进行升级即可,没必要再下去了;

考虑一下时间复杂度,操作3的复杂度由于指数的保证,均摊不会超过O(log22n),操作2复杂度相当,操作1复杂度O(logn),总复杂度O(nlog22n),过掉这道题还是比较轻松的;

对于这道题需要注意的是,lazy标记的下传,需要头脑十分清晰;

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<cmath>
  6. #include<cstdlib>
  7. #include<ctime>
  8. #include<algorithm>
  9. using namespace std;
  10. #define mid ((l+r)>>1)
  11. #define LL long long
  12. #define FILE "dealing"
  13. #define up(i,j,n) for(LL i=(j);i<=(n);i++)
  14. #define pii pair<LL,LL>
  15. LL read(){
  16. LL x=0,f=1,ch=getchar();
  17. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  18. while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  19. return f*x;
  20. }
  21. const LL maxn=1000100,inf=1000000000000000LL,mod=998244353;
  22. LL n,m,a[maxn];
  23. LL x,y,c;
  24. LL f[maxn],d[maxn],g[maxn],del[maxn],Max[maxn],mi[20],flag[maxn],level;
  25. pii ch(LL x){up(i,0,11)if(x<mi[i])return make_pair(i,x-mi[i]);}
  26. void upp(LL o){
  27. while(f[o]>0){
  28. g[o]++;
  29. Max[o]=f[o]=Max[o]+mi[g[o]-1]-mi[g[o]];
  30. }
  31. }
  32. void pushdown(LL x){
  33. if(del[x]){
  34. Max[x<<1]+=del[x],Max[x<<1|1]+=del[x];
  35. if(d[x<<1])f[x<<1]+=del[x],upp(x<<1);
  36. else del[x<<1]+=del[x];
  37. if(d[x<<1|1])f[x<<1|1]+=del[x],upp(x<<1|1);
  38. else del[x<<1|1]+=del[x];
  39. del[x]=0;
  40. }
  41. if(d[x]){
  42. Max[x<<1]=Max[x<<1|1]=f[x];
  43. del[x<<1]=del[x<<1|1]=0;
  44. g[x<<1]=g[x<<1|1]=g[x];
  45. d[x<<1]=d[x<<1|1]=1;
  46. f[x<<1]=f[x<<1|1]=f[x];
  47. d[x]=0;f[x]=0;
  48. }
  49. }
  50. void updata(LL x){
  51. Max[x]=max(Max[x<<1],Max[x<<1|1]);
  52. g[x]=(Max[x<<1]>Max[x<<1|1])?g[x<<1]:g[x<<1|1];
  53. if(flag[x<<1]&&flag[x<<1|1]&&Max[x<<1]==Max[x<<1|1]&&g[x<<1]==g[x<<1|1])flag[x]=1;
  54. else flag[x]=0;
  55. }
  56. LL query(LL l,LL r,LL o){//求[x,y]区间最大值
  57. if(l>y||r<x)return -inf;
  58. if(l>=x&&r<=y){level=g[o];return Max[o];}
  59. pushdown(o);
  60. return max(query(l,mid,o<<1),query(mid+1,r,o<<1|1));
  61. }
  62. void change(LL l,LL r,LL o){//将[x,y]区间赋为c
  63. if(l>y||r<x)return;
  64. if(l>=x&&r<=y){
  65. d[o]=1;flag[o]=1;
  66. del[o]=0;
  67. pii x=ch(c);
  68. f[o]=x.second;
  69. Max[o]=x.second;
  70. g[o]=x.first;
  71. return;
  72. }
  73. pushdown(o);
  74. change(l,mid,o<<1);
  75. change(mid+1,r,o<<1|1);
  76. updata(o);
  77. }
  78. void Change(LL l,LL r,LL o){//将[x,y]区间加c
  79. if(l>y||r<x)return;
  80. if(l>=x&&r<=y){
  81. Max[o]+=c;
  82. if(d[o]){
  83. f[o]+=c;
  84. if(f[o]>0){
  85. while(Max[o]>0){
  86. g[o]++;
  87. Max[o]=f[o]=Max[o]+mi[g[o]-1]-mi[g[o]];
  88. }
  89. }
  90. }
  91. else del[o]+=c;
  92. return;
  93. }
  94. pushdown(o);
  95. Change(l,mid,o<<1);
  96. Change(mid+1,r,o<<1|1);
  97. updata(o);
  98. }
  99. void upgrade(LL l,LL r,LL o){//将[1,n]中的所有点升级
  100. if(flag[o]){
  101. d[o]=1;
  102. while(Max[o]>0){
  103. g[o]++;
  104. f[o]=Max[o]=Max[o]+mi[g[o]-1]-mi[g[o]];
  105. }
  106. return;
  107. }
  108. pushdown(o);
  109. if(Max[o<<1]>0)upgrade(l,mid,o<<1);
  110. if(Max[o<<1|1]>0)upgrade(mid+1,r,o<<1|1);
  111. updata(o);
  112. }
  113. void build(LL l,LL r,LL o){
  114. if(l==r){
  115. flag[o]=1;
  116. pii x=ch(a[l]);
  117. Max[o]=x.second;
  118. g[o]=x.first;
  119. flag[o]=1;
  120. return;
  121. }
  122. build(l,mid,o<<1);
  123. build(mid+1,r,o<<1|1);
  124. updata(o);
  125. }
  126. int main(){
  127. n=read();m=read();
  128. mi[0]=1;
  129. up(i,1,11)mi[i]=mi[i-1]*42;
  130. up(i,1,n)a[i]=read();
  131. build(1,n,1);
  132. while(m--){
  133. LL ch=read();
  134. if(ch==1){
  135. y=x=read();
  136. printf("%lld\n",query(1,n,1)+mi[level]);
  137. }
  138. if(ch==2){
  139. x=read(),y=read(),c=read();
  140. change(1,n,1);
  141. }
  142. if(ch==3){
  143. x=read(),y=read(),c=read();
  144. do{
  145. Change(1,n,1);
  146. upgrade(1,n,1);
  147. if(Max[1]<0)break;
  148. }while(1);
  149. }
  150. }
  151. return 0;
  152. }

  

codeforces 679e Bear and Bad Powers of 42的更多相关文章

  1. Codeforces 679E - Bear and Bad Powers of 42(线段树+势能分析)

    Codeforces 题目传送门 & 洛谷题目传送门 这个 \(42\) 的条件非常奇怪,不过注意到本题 \(a_i\) 范围的最大值为 \(10^{14}\),而在值域范围内 \(42\) ...

  2. Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E

    http://codeforces.com/contest/121/problem/E 话说这题貌似暴力可A啊... 正解是想出来了,结果重构代码,调了不知道多久才A 错误记录: 1.线段树搞混num ...

  3. CF679E Bear and Bad Powers of 42

    一段时间不写线段树标记,有些生疏了 codeforces 679e Bear and Bad Powers of 42 - CHADLZX - 博客园 关键点是:42的次幂,在long long范围内 ...

  4. Codeforces679E. Bear and Bad Powers of 42

    传送门 今天子帧的一套模拟题的T3. 考试的时候其实已经想到了正解了,但是一些地方没有想清楚,就没敢写,只打了个暴力. 首先考虑用线段树维护区间信息. 先把每个值拆成两个信息,一是距离他最近的且大于他 ...

  5. Codeforces 385C Bear and Prime Numbers

    题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...

  6. Codeforces 385B Bear and Strings

    题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...

  7. Codeforces 680D Bear and Tower of Cubes 贪心 DFS

    链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...

  8. Codeforces 385C Bear and Prime Numbers(素数预处理)

    Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出 ...

  9. [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)

    [Codeforces 639F] Bear and Chemistry(Tarjan+虚树) 题面 给出一个n个点,m条边的无向图(不保证连通,可能有自环和重边),有q次询问,每次询问给出p个点和q ...

随机推荐

  1. codeblocks 中文编码问题

    参考文章: code::blocks 初使用遇到的问题记录 codeblocks 中文编码问题 string var="汉"; cout<<var<<end ...

  2. 标准C程序设计七---00

    以下内容为阅读: <21天学通C语言>(第7版) 作者:Bradley Jones  Peter Aitken  Dean Miller(美), 姜佑译 人民邮电出版社  2014.11 ...

  3. iscroll API

    概况 资料来源 http://cubiq.org/iscroll-4 http://www.cnblogs.com/wanghun/archive/2012/10/17/2727416.html ht ...

  4. Java 新手进阶:细说引用类型

    在前几天的帖子<Java性能优化[1]:基本类型 vs 引用类型>里,俺大概介绍了“引用类型”与“基本类型”在存储上的区别.昨天有网友在评论中批评说“引用类型变量和它所引用的对象”没区分清 ...

  5. 洛谷 P1503鬼子进村

    题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里 ...

  6. mysql统计功能和数据库information_schema/performance_schema

    1.去重统计数据表行数: select count(distinct col_name) from table_name; 2.统计行数 select count(*) from table_name ...

  7. 前端高频面试题 JavaScript篇

    以下问题都来自于互联网前端面经分享,回答为笔者通过查阅资料加上自身理解总结,不保证解答的准确性,有兴趣讨论的同学可以留言或者私信讨论. 1.JS的异步机制? 2.闭包如何实现? 3.原型链.继承? 4 ...

  8. 转:CEO, CFO, CIO, CTO, CSO是什么

    转自:https://club.1688.com/threadview/26957122.html CEO, CFO, CIO, CTO, CSO是什么?(现在O太多了) 帖子创建时间:  2009年 ...

  9. 如何干掉那些.ipch 与 .sdf文件

    参考资料: http://blog.163.com/yangjun1988422@126/blog/static/47412917201074446054/     vs2010中臃肿的ipch和sd ...

  10. 2014MadCon厦门分享会-笔记(下)

    32 <如何与百度互动,不知道这些就不要做SEO了>百度站长平台资深产品运营师 曹丽丽(飞鸟) 33 注意百度站长平台的提醒.如果你不留电话,不留其他联系方式,出问题了,百度怎么提醒你呢? ...