传送门: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. Spring-IOC源码解读3-依赖注入

    当容器已经载入了BeanDefinition的信息完成了初始化,我们继续分析依赖注入的原理,需要注意的是依赖注入是用户第一次向IOC容器获取Bean的时候发生的,这里有个例外,那就是如果用户在Bean ...

  2. mysql 插入replace改变原有数据某些字段

    完整原型:(主要看下面例子) replace into rpt_ci_cinema_seller_shift_dt ( BIZ_DATE,CINEMA_CD,SELLER_CD,LOCATION_CD ...

  3. hdu 2686 费用流 / 双线程DP

    题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1  费用流法:思路转化:从左 ...

  4. python判断一个字符串是否是小数

    最近在写代码的时候,发现一个问题,想判断一个字符串是不是一个合法的小数,发现字符串没有内置判断小数的方法,然后就写了一个判断字符串是否是小数,可以判断正负小数,代码如下:   1 2 3 4 5 6 ...

  5. oracle学习笔记(十四) 数据库对象 索引 视图 序列 同义词

    数据库对象 用户模式:指数据库用户所创建和存储数据对象的统称.在访问其它用户模式的数据库对象时需加上用户模式. 如:scott.emp, scott.dept等. 数据库对象包括:表.视图.索引.序列 ...

  6. webstorm(二):拼写warning

    逼死强迫症之对拼写进行检查,警告 typo:in word “msgfromfather”

  7. Java对象的死亡

    在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象). 一,引用计数算法 给 ...

  8. Python知识图谱

    一.Python全栈图谱 2.Python语言高级 Python 全栈工程师前端 Python全栈工程师后端 Python Linux运维自动化开发 Python KaliLinux信息安全开发和使用 ...

  9. mysql 复制数据库

    为了方便快速复制一个数据库,可以用以下命令 将db1数据库的数据以及表结构复制到newdb数据库 创建新的数据库 #mysql -u root -p123456 mysql>CREATE DAT ...

  10. Python--学习过程

    基础篇 Python基础篇 Python的数据类型 作业总结