CF679E Bear and Bad Powers of 42
一段时间不写线段树标记,有些生疏了
codeforces 679e Bear and Bad Powers of 42 - CHADLZX - 博客园
关键点是:42的次幂,在long long范围内只有11个
考虑暴力修改
记录每个点距离下一个42次幂的距离,一般是负数
再记录每个点的等级,则有num=mi[lev+1]+val
特别地,当val=0的时候,num就是第lev个42的次幂
假如只有3操作,区间加,如果当前区间最大值大于等于0,
那么暴力下去升级:如果区间最大值大于等于0,就接着升级。如果升级途中,发现一个点的val==0,意味着还要再进行这个操作,flag记录一下
每个数只增不减,而且不会重复加太多次,大概每个点最多会被加O(logn)次,复杂度就是O(nlog^2n)
加上2操作,区间赋值会把很多数“拉回来”,而且一次性增加很多42次幂
但是权值种类会少很多,至少整个区间都是一个数
所以记录区间是否都是一个数,如果是一个数,就不用暴力修改了
增加了常数个42次幂的可能,也不会太多
这一步也就O(nlogn)
1的询问就是O(nlogn)
总复杂度正确
代码:
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
#define fi first
#define se second
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,q;
int U;
ll a[N];
ll mi[];
pair<ll,ll> zip(ll x){
int p=lower_bound(mi,mi+U+,x)-mi;
--p;
return make_pair(p,x-mi[p+]);
}
ll num(int lev,ll dis){
return mi[lev+]+dis;
}
struct tr{
ll mx; ll ad,chan; int same;
int lev;ll val;
}t[*N]; void pushup(int x){
t[x].mx=max(t[x<<].mx,t[x<<|].mx);
if(t[x<<].same&&t[x<<|].same&&t[x<<].val==t[x<<|].val&&t[x<<].lev==t[x<<|].lev){
t[x].same=;
t[x].val=t[x<<].val;
t[x].lev=t[x<<].lev;
}else{
t[x].same=;
}
}
pair<ll,ll>tmp;
void pro(int &lev,ll &dis){
ll now=num(lev,dis);
tmp=zip(now);
lev=tmp.fi;
dis=tmp.se;
}
void build(int x,int l,int r){
if(l==r){
t[x].same=;
tmp=zip(a[l]);
t[x].mx=t[x].val=tmp.se;
t[x].lev=tmp.fi;
t[x].chan=-inf;//warninig!!!! -inf represented no change
t[x].ad=;
return;
}
t[x].ad=;
t[x].chan=-inf;
build(ls,l,mid);build(rs,mid+,r);
pushup(x);
}
void pushdown(int x){
for(reg i=;i<=;++i){
int son=x<<|i;
if(t[x].chan!=-inf){
ll c=t[x].chan;
t[son].same=;
tmp=zip(c);
t[son].lev=tmp.fi;
t[son].val=tmp.se;
t[son].ad=;
t[son].chan=c;
t[son].mx=t[son].val;
}else if(t[x].ad){
ll c=t[x].ad;
if(t[son].same){
//if(t[x].mx+c==0) c+=c;//warning!!! if(t[son].chan!=-inf){
t[son].chan+=c;
}
else{
t[son].ad+=c;
}
t[son].val+=c;
pro(t[son].lev,t[son].val);
t[son].mx=t[son].val;
}
else{
t[son].mx+=c;
t[son].ad+=c;
}
}
}
t[x].ad=;
t[x].chan=-inf;
}
bool upda(int x,int l,int r){//bao li updaing level
if(l==r){
if(t[x].val==){
return true;
}
return false;
}
else if(t[x].same){
if(t[x].val==) return true;
return false;
}
pushdown(x);
bool ret=false;
if(t[ls].mx>=) ret|=upda(x<<,l,mid);
if(t[rs].mx>=) ret|=upda(x<<|,mid+,r);
pushup(x);//warinnig!!!!
return ret;
} int flag;
void add(int x,int l,int r,int L,int R,ll c){
if(L<=l&&r<=R){
if(t[x].same){
if(t[x].chan!=-inf){
t[x].chan+=c;
}
else{
t[x].ad+=c;
}
t[x].val+=c;
pro(t[x].lev,t[x].val);
t[x].mx=t[x].val; if(t[x].mx==) flag=;//need again
}
else{
t[x].mx+=c;
t[x].ad+=c;
if(t[x].mx>=){
flag|=upda(x,l,r);
// while(fl){
// fl=upda(x,l,r);
// if(fl) {
// t[x].mx+=c;
// t[x].ad+=c;
// }
// if(t[x].mx>=0){
// fl=true;
// }else{
// fl=false;
// }
// }
}
}
return;
}
pushdown(x);
if(L<=mid) add(x<<,l,mid,L,R,c);
if(mid<R) add(x<<|,mid+,r,L,R,c);
pushup(x);
}
void chan(int x,int l,int r,int L,int R,ll c){
if(L<=l&&r<=R){
t[x].same=;
tmp=zip(c);
t[x].lev=tmp.fi;
t[x].val=tmp.se;
t[x].ad=;
t[x].chan=c;
t[x].mx=t[x].val;
return;
}
pushdown(x);
if(L<=mid) chan(x<<,l,mid,L,R,c);
if(mid<R) chan(x<<|,mid+,r,L,R,c);
pushup(x);
}
ll query(int x,int l,int r,int p){
if(l==r){
return num(t[x].lev,t[x].val);
}
pushdown(x);
if(p<=mid) return query(ls,l,mid,p);
else return query(rs,mid+,r,p);
}
int main(){
rd(n);rd(q);
for(reg i=;i<=n;++i){
scanf("%lld",&a[i]);
}
mi[]=;
for(reg i=;i<=;++i) mi[i]=mi[i-]*;
U=;
build(,,n);
int op,l,r,p;
ll c;
while(q--){
rd(op);
if(op==){
rd(p);
printf("%lld\n",query(,,n,p));
}
else if(op==){
rd(l);rd(r);
scanf("%lld",&c);
chan(,,n,l,r,c);
}else{
rd(l);rd(r);
scanf("%lld",&c);
flag=;
add(,,n,l,r,c);
while(flag){
flag=;
add(,,n,l,r,c);
}
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/14 20:07:14
*/
CF679E Bear and Bad Powers of 42的更多相关文章
- Codeforces679E. Bear and Bad Powers of 42
传送门 今天子帧的一套模拟题的T3. 考试的时候其实已经想到了正解了,但是一些地方没有想清楚,就没敢写,只打了个暴力. 首先考虑用线段树维护区间信息. 先把每个值拆成两个信息,一是距离他最近的且大于他 ...
- codeforces 679e Bear and Bad Powers of 42
传送门:http://codeforces.com/contest/679/problem/E 题目意思很清晰,给你一个序列,要求你完成以下三个操作: 1.输出A[i] 2.将[a,b]区间的所有数字 ...
- Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E
http://codeforces.com/contest/121/problem/E 话说这题貌似暴力可A啊... 正解是想出来了,结果重构代码,调了不知道多久才A 错误记录: 1.线段树搞混num ...
- Codeforces 679E - Bear and Bad Powers of 42(线段树+势能分析)
Codeforces 题目传送门 & 洛谷题目传送门 这个 \(42\) 的条件非常奇怪,不过注意到本题 \(a_i\) 范围的最大值为 \(10^{14}\),而在值域范围内 \(42\) ...
- (Problem 29)Distinct powers
Consider all integer combinations ofabfor 2a5 and 2b5: 22=4, 23=8, 24=16, 25=32 32=9, 33=27, 34=81, ...
- Codeforces Round #356 (Div. 2) D. Bear and Tower of Cubes dfs
D. Bear and Tower of Cubes 题目连接: http://www.codeforces.com/contest/680/problem/D Description Limak i ...
- codeforces 680D D. Bear and Tower of Cubes(dfs+贪心)
题目链接: D. Bear and Tower of Cubes time limit per test 2 seconds memory limit per test 256 megabytes i ...
- 【19.05%】【codeforces 680D】Bear and Tower of Cubes
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 1142 - Summing up Powers (II)
1142 - Summing up Powers (II) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit ...
随机推荐
- Huploadify V2.1+ SpringMVC上传文件的实现
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 20155207王雪纯《网络对抗》Exp4 恶意代码分析
20155207 <网络对抗> 恶意代码分析 学习总结 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件 ...
- 20155302《网络对抗》Exp7 网络欺诈防范
20155302<网络对抗>Exp7 网络欺诈防范 实验内容 (1)简单应用SET工具建立冒名网站 (1分) (2)ettercap DNS spoof (1分) (3)结合应用两种技术, ...
- 20155320《网络对抗》Exp4 恶意代码分析
20155320<网络对抗>Exp4 恶意代码分析 [系统运行监控] 使用schtasks指令监控系统运行 首先在C盘目录下建立一个netstatlog.bat文件(由于是系统盘,所以从别 ...
- JavaScript组成—— DOM、BOM、ECMAScript
ECMAScript是JS的核心:提供核心语言功能 DOM(文档对象模型):提供访问和操作网页内容的方法和接口 BOM(浏览器对象模型):提供与浏览器交互的方法和接口 1. DOM(文档对象模型) 1 ...
- 大话Java中的哈希(hash)结构(一)
o( ̄▽ ̄)d 小伙伴们在上网或者搞程序设计的时候,总是会听到关于“哈希(hash)”的一些东西.比如哈希算法.哈希表等等的名词,那么什么是hash呢? 一.相关概念 1.hash算法:一类特殊的算法 ...
- FastDFS教程Ⅰ-文件服务器安装与Nginx配置
1.简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载 ...
- Git版本库的创建(Ubuntu)
在Ubuntu上学习Git随笔. 一. git 仓库的安装 git 在终端用git命令查看Ubuntu是否安装git版本库,如果没有安装,最新版本(Ubuntu18.04)会提示用下面命令进行安装. ...
- Unity Dotween官方案例学习
本文只涉及一些案例,具体查看 DoTween 官方文档. 一. Basics public class Basics : MonoBehaviour { public Transform redCub ...
- python之GIL理解
GIL(Global Interpreter Lock) 全局解释器锁 python3中是假的多线程,它不是真正的并行,是利用了cpu上下文的切换而已.同一时间只能有一个线程使用共享数据,其它线程处于 ...