codeforces 679e Bear and Bad Powers of 42
传送门: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的更多相关文章
- Codeforces 679E - Bear and Bad Powers of 42(线段树+势能分析)
Codeforces 题目传送门 & 洛谷题目传送门 这个 \(42\) 的条件非常奇怪,不过注意到本题 \(a_i\) 范围的最大值为 \(10^{14}\),而在值域范围内 \(42\) ...
- Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E
http://codeforces.com/contest/121/problem/E 话说这题貌似暴力可A啊... 正解是想出来了,结果重构代码,调了不知道多久才A 错误记录: 1.线段树搞混num ...
- CF679E Bear and Bad Powers of 42
一段时间不写线段树标记,有些生疏了 codeforces 679e Bear and Bad Powers of 42 - CHADLZX - 博客园 关键点是:42的次幂,在long long范围内 ...
- Codeforces679E. Bear and Bad Powers of 42
传送门 今天子帧的一套模拟题的T3. 考试的时候其实已经想到了正解了,但是一些地方没有想清楚,就没敢写,只打了个暴力. 首先考虑用线段树维护区间信息. 先把每个值拆成两个信息,一是距离他最近的且大于他 ...
- Codeforces 385C Bear and Prime Numbers
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...
- Codeforces 385B Bear and Strings
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...
- Codeforces 680D Bear and Tower of Cubes 贪心 DFS
链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...
- Codeforces 385C Bear and Prime Numbers(素数预处理)
Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出 ...
- [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)
[Codeforces 639F] Bear and Chemistry(Tarjan+虚树) 题面 给出一个n个点,m条边的无向图(不保证连通,可能有自环和重边),有q次询问,每次询问给出p个点和q ...
随机推荐
- Virtual Box 安装过程(卸载Vmware后)
VirtualBox安装前的操作:(或许某些操作不一定有用,但是我是这么做下来的,最后也安装成功了) 步骤一:停止之前安装的vmware的所有服务(如果之前没有安装过虚拟机软件,无需做此操作)VMwa ...
- 通过new ClasspathApplicationContext("applicationContext.xml")找不到文件时
可以把applicationContext.xml放到/WEB-INF/classes目录下使用先说:ClassPathXmlApplicationContext 这个类,默认获取的是WEB-INF/ ...
- Nk 1430 Divisors(因子数与质因数)
Time Limit: 5000 ms Memory Limit: 10000 kB Total Submit : 432 (78 users) Accepted Submit : 10 ...
- [MFC] CFile读写文件实现(高效)
1.文件写入 void CMFCApplication1Dlg::Write() { CFile file; CString FileName = "D:\\100w.txt"; ...
- bash变量类型详解
本地变量:作用于当前shell,对当前shell之外的其他shell进程和当前shell子进程均无效. 本地变量赋值为 name='value' value可以是字符串或者是变量,引用变量使用${na ...
- Redis命令行之Hash
一.Redis之Hash简介 1. Hash是一个string类型的field和value的映射表,适合用于存储对象. 2. 每个hash可以存储232-1个键值对(40多亿). 二.Redis之Ha ...
- HttpClient配置
ClientConfiguration.java 该类讲解了HttpClient的各方面的配置 package com.ydd.study.hello.httpclient; import java. ...
- 【Java TCP/IP Socket】基于线程池的TCP服务器(含代码)
了解线程池 在http://blog.csdn.net/ns_code/article/details/14105457(读书笔记一:TCP Socket)这篇博文中,服务器端采用的实现方式是:一个客 ...
- 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 ...
- 基于Office 365 无代码工作流分析-表单基本需求分析!
3.2表单的制作 基于下图的需求,我们须要定义例如以下的表单列表: