传送门: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标记的下传,需要头脑十分清晰;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
#define mid ((l+r)>>1)
#define LL long long
#define FILE "dealing"
#define up(i,j,n) for(LL i=(j);i<=(n);i++)
#define pii pair<LL,LL>
LL read(){
LL x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f*x;
}
const LL maxn=1000100,inf=1000000000000000LL,mod=998244353;
LL n,m,a[maxn];
LL x,y,c;
LL f[maxn],d[maxn],g[maxn],del[maxn],Max[maxn],mi[20],flag[maxn],level;
pii ch(LL x){up(i,0,11)if(x<mi[i])return make_pair(i,x-mi[i]);}
void upp(LL o){
while(f[o]>0){
g[o]++;
Max[o]=f[o]=Max[o]+mi[g[o]-1]-mi[g[o]];
}
}
void pushdown(LL x){
if(del[x]){
Max[x<<1]+=del[x],Max[x<<1|1]+=del[x];
if(d[x<<1])f[x<<1]+=del[x],upp(x<<1);
else del[x<<1]+=del[x];
if(d[x<<1|1])f[x<<1|1]+=del[x],upp(x<<1|1);
else del[x<<1|1]+=del[x];
del[x]=0;
}
if(d[x]){
Max[x<<1]=Max[x<<1|1]=f[x];
del[x<<1]=del[x<<1|1]=0;
g[x<<1]=g[x<<1|1]=g[x];
d[x<<1]=d[x<<1|1]=1;
f[x<<1]=f[x<<1|1]=f[x];
d[x]=0;f[x]=0;
}
}
void updata(LL x){
Max[x]=max(Max[x<<1],Max[x<<1|1]);
g[x]=(Max[x<<1]>Max[x<<1|1])?g[x<<1]:g[x<<1|1];
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;
else flag[x]=0;
}
LL query(LL l,LL r,LL o){//求[x,y]区间最大值
if(l>y||r<x)return -inf;
if(l>=x&&r<=y){level=g[o];return Max[o];}
pushdown(o);
return max(query(l,mid,o<<1),query(mid+1,r,o<<1|1));
}
void change(LL l,LL r,LL o){//将[x,y]区间赋为c
if(l>y||r<x)return;
if(l>=x&&r<=y){
d[o]=1;flag[o]=1;
del[o]=0;
pii x=ch(c);
f[o]=x.second;
Max[o]=x.second;
g[o]=x.first;
return;
}
pushdown(o);
change(l,mid,o<<1);
change(mid+1,r,o<<1|1);
updata(o);
}
void Change(LL l,LL r,LL o){//将[x,y]区间加c
if(l>y||r<x)return;
if(l>=x&&r<=y){
Max[o]+=c;
if(d[o]){
f[o]+=c;
if(f[o]>0){
while(Max[o]>0){
g[o]++;
Max[o]=f[o]=Max[o]+mi[g[o]-1]-mi[g[o]];
}
}
}
else del[o]+=c;
return;
}
pushdown(o);
Change(l,mid,o<<1);
Change(mid+1,r,o<<1|1);
updata(o);
}
void upgrade(LL l,LL r,LL o){//将[1,n]中的所有点升级
if(flag[o]){
d[o]=1;
while(Max[o]>0){
g[o]++;
f[o]=Max[o]=Max[o]+mi[g[o]-1]-mi[g[o]];
}
return;
}
pushdown(o);
if(Max[o<<1]>0)upgrade(l,mid,o<<1);
if(Max[o<<1|1]>0)upgrade(mid+1,r,o<<1|1);
updata(o);
}
void build(LL l,LL r,LL o){
if(l==r){
flag[o]=1;
pii x=ch(a[l]);
Max[o]=x.second;
g[o]=x.first;
flag[o]=1;
return;
}
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
updata(o);
}
int main(){
n=read();m=read();
mi[0]=1;
up(i,1,11)mi[i]=mi[i-1]*42;
up(i,1,n)a[i]=read();
build(1,n,1);
while(m--){
LL ch=read();
if(ch==1){
y=x=read();
printf("%lld\n",query(1,n,1)+mi[level]);
}
if(ch==2){
x=read(),y=read(),c=read();
change(1,n,1);
}
if(ch==3){
x=read(),y=read(),c=read();
do{
Change(1,n,1);
upgrade(1,n,1);
if(Max[1]<0)break;
}while(1);
}
}
return 0;
}

  

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. LoadBitmap(IDB_BITMAP1) -- 未定义标识符 IDB_BITMAP1

    错误原因:1:头文件没有加入 #include"resource.h" 2:没有导入该资源或者资源ID错误

  2. (转)java 中变量存储位置总结

    1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符 ...

  3. Yii 之数据库查询

    模型代码: <?php namespace app\models; use yii\db\ActiveRecord; class Test extends ActiveRecord{ } 控制器 ...

  4. Linux出现cannot create temp file for here-document: No space left on device的问题解决

    在终端输入:cd /ho 按tab键时,显示错误: bash: cannot create temp file for here-document: No space left on device 这 ...

  5. Docker 基础底层架构浅谈

    docker学习过程中,免不了需要学习下docker的底层技术,今天我们来记录下docker的底层架构吧! 从上图我们可以看到,docker依赖于linux内核的三个基本技术:namespaces.C ...

  6. 反混淆:恢复被OLLVM保护的程序

    译者序: OLLVM作为代码混淆的优秀开源项目,在国内主流app加固应用中也经常能看到它的身影,但是公开的分析研究资料寥寥.本文是Quarkslab团队技术博客中一篇关于反混淆的文章,对OLLVM项目 ...

  7. aSmack连接server异常smack.SmackException$ ConnectionException thrown by XMPPConnection.connect();

    以下是我在研究asmack4.0出现的异常 06-17 12:02:56.924: W/System.err(10622): org.jivesoftware.smack.SmackException ...

  8. XStream 数组(List)输出结构

    <!-- 期望的DOM树 --> <Articles> <item> <Title>微信SDK初步结构</Title> <Descri ...

  9. BeagleBone Black Industrial 杂谈

    前言 原创文章,转载引用务必注明链接.水平有限一己拙见,欢迎指正. 本文使用markdown写成,为获得更好的阅读体验,推荐访问我的博客原文: ​ 初版BeagleBone Black(Rev A4) ...

  10. 吃我一记咸鱼突刺——使用板载RTC定时开机

    前言 原创文章,转载引用务必注明链接.水平有限,欢迎指正. 2016年3月30日 Lemuntu(Base On Jessie) 3.10.37 原载于Lemaker论坛.汇总于此. 看ATC2603 ...