传送门: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. [JSOI2007] 祖玛 (区间DP)

    题目描述 这是一个流行在Jsoi的游戏,名称为祖玛. 精致细腻的背景,外加神秘的印加音乐衬托,彷佛置身在古老的国度里面,进行一个神秘的游戏——这就是著名的祖玛游戏.祖玛游戏的主角是一只石青蛙,石青蛙会 ...

  2. 【2018.10.18】CXM笔记(动态规划)

    1.给你一棵树,让你修任意多条点不相交的铁路(每条铁路都是一根链),定义一个点的代价为它到根节点的路径中不在铁路上的边数,求一种设计方案代价最大的点最小. 铁路点不相交与 每个点连出去的铁路条数 $\ ...

  3. VS2015 “GENERATERESOURCE”任务意外失败 解决方法

    昨天把项目解决方案Copy到另外的机器上执行,遭遇了一场"任务意外失败",网上搜索一下,顺利解决了,在此记录一下. Visual Studio.net 工程更换机器编译时遇到”Ge ...

  4. 【BZOJ3450】Easy(期望)

    题意: 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a ...

  5. Mac 快速修改 hosts 文件

    sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts

  6. Poi写文件时报java.io.IOException: Read error

    使用POI报表时不停的报java.io.IOException: Read error,看网上是说关闭了InputStream所导致的,由于我的InputStream是读取和写入都是用的同一个,所以就 ...

  7. elasticsearch入门使用(二) Mapping + field type字段类型

    Elasticsearch Reference [6.2] » Mapping 参考官方英文文档 https://www.elastic.co/guide/en/elasticsearch/refer ...

  8. Struts2的值栈和OGNL牛逼啊

    Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...

  9. 最近遇到的C++数字和字符串的转换问题

    1. 用itoa 和atoi  在头文件#include<cstidlib> itoa用法: char * itoa ( int value, char * str, int base ) ...

  10. html+vlc 播放多视频

    html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...