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 ...
随机推荐
- 20155302《网络对抗》Exp6 信息收集与漏洞扫描
20155302<网络对抗>Exp6 信息收集与漏洞扫描 实验内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测 ...
- vue-cli 动态绑定图片失败
1.template 中引用图片,第一个为固定路径,第二个为动态绑定路径 eg: <img src="XXXXXX.png" alt=""> < ...
- 连接到win2003的远程桌面,客户端要如何操作
第一步:命令行执行mstsc 第二步:处输入开启了远程桌面功能的计算机IP地址.
- [CF1067D]Computer Game[凸包/斜率优化+倍增+矩阵乘法]
题意 你有 \(n\) 个任务,初始收益为 \(a\) ,共 \(t\) 轮游戏,每轮可以选择完成一个任务(可以做多次),完成之后可以给任意任务升级,升级之后的任务收益为 \(b\) ,每个任务还有完 ...
- 不再迷惑,无值和NULL值
在关系型数据库的世界中,无值和NULL值的区别是什么?一直被这个问题困扰着,甚至在写TSQL脚本时,战战兢兢,如履薄冰,害怕因为自己的一知半解,挖了坑,贻害后来人,于是,本着上下求索,不达通幽不罢休的 ...
- 利用BFS实现最短路
首先,我们要知道BFS的思想,BFS全称是Breadth-First-Search. 二叉树的BFS:通过BFS访问,它们的访问顺序是它们到根节点距离从小到大的排序. 图的BFS:同样的,离起点越近, ...
- wordpress 5.1 后台拿shell
闲着没事搭建了一套最新版wordpress 5.1,本身wordpress后台安全防御是比较差的,想尝试下后台是否可以拿shell. 再上传插件的地方可以直接上传php文件,并且该文件可以执行: sh ...
- @JsonFormat时间格式化注解使用
@JsonFormat注解是一个时间格式化注解,比如我们存储在mysql中的数据是date类型的,当我们读取出来封装在实体类中的时候,就会变成英文时间格式,而不是yyyy-MM-dd HH:mm:ss ...
- PAT甲题题解-1001. A+B Format (20)-字符串处理,水
计算A+B的和,并且按标准格式处理,每3个就要有个逗号 #include <iostream> #include <cstdio> #include <algorithm ...
- PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)
题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车 ...