传送门: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. Virtual Box 安装过程(卸载Vmware后)

    VirtualBox安装前的操作:(或许某些操作不一定有用,但是我是这么做下来的,最后也安装成功了) 步骤一:停止之前安装的vmware的所有服务(如果之前没有安装过虚拟机软件,无需做此操作)VMwa ...

  2. 通过new ClasspathApplicationContext("applicationContext.xml")找不到文件时

    可以把applicationContext.xml放到/WEB-INF/classes目录下使用先说:ClassPathXmlApplicationContext 这个类,默认获取的是WEB-INF/ ...

  3. Nk 1430 Divisors(因子数与质因数)

    Time Limit: 5000 ms    Memory Limit: 10000 kB   Total Submit : 432 (78 users)   Accepted Submit : 10 ...

  4. [MFC] CFile读写文件实现(高效)

    1.文件写入 void CMFCApplication1Dlg::Write() { CFile file; CString FileName = "D:\\100w.txt"; ...

  5. bash变量类型详解

    本地变量:作用于当前shell,对当前shell之外的其他shell进程和当前shell子进程均无效. 本地变量赋值为 name='value' value可以是字符串或者是变量,引用变量使用${na ...

  6. Redis命令行之Hash

    一.Redis之Hash简介 1. Hash是一个string类型的field和value的映射表,适合用于存储对象. 2. 每个hash可以存储232-1个键值对(40多亿). 二.Redis之Ha ...

  7. HttpClient配置

    ClientConfiguration.java 该类讲解了HttpClient的各方面的配置 package com.ydd.study.hello.httpclient; import java. ...

  8. 【Java TCP/IP Socket】基于线程池的TCP服务器(含代码)

    了解线程池 在http://blog.csdn.net/ns_code/article/details/14105457(读书笔记一:TCP Socket)这篇博文中,服务器端采用的实现方式是:一个客 ...

  9. argument to nsmutablearray method addobject cannot be nil 警告

    You cannot add nil to an NSMutableArray, and you will raise an exception if you try to. There's NSNu ...

  10. 基于Office 365 无代码工作流分析-表单基本需求分析!

     3.2表单的制作 基于下图的需求,我们须要定义例如以下的表单列表: