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 ...
随机推荐
- codeblocks 中文编码问题
参考文章: code::blocks 初使用遇到的问题记录 codeblocks 中文编码问题 string var="汉"; cout<<var<<end ...
- 标准C程序设计七---00
以下内容为阅读: <21天学通C语言>(第7版) 作者:Bradley Jones Peter Aitken Dean Miller(美), 姜佑译 人民邮电出版社 2014.11 ...
- iscroll API
概况 资料来源 http://cubiq.org/iscroll-4 http://www.cnblogs.com/wanghun/archive/2012/10/17/2727416.html ht ...
- Java 新手进阶:细说引用类型
在前几天的帖子<Java性能优化[1]:基本类型 vs 引用类型>里,俺大概介绍了“引用类型”与“基本类型”在存储上的区别.昨天有网友在评论中批评说“引用类型变量和它所引用的对象”没区分清 ...
- 洛谷 P1503鬼子进村
题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里 ...
- mysql统计功能和数据库information_schema/performance_schema
1.去重统计数据表行数: select count(distinct col_name) from table_name; 2.统计行数 select count(*) from table_name ...
- 前端高频面试题 JavaScript篇
以下问题都来自于互联网前端面经分享,回答为笔者通过查阅资料加上自身理解总结,不保证解答的准确性,有兴趣讨论的同学可以留言或者私信讨论. 1.JS的异步机制? 2.闭包如何实现? 3.原型链.继承? 4 ...
- 转:CEO, CFO, CIO, CTO, CSO是什么
转自:https://club.1688.com/threadview/26957122.html CEO, CFO, CIO, CTO, CSO是什么?(现在O太多了) 帖子创建时间: 2009年 ...
- 如何干掉那些.ipch 与 .sdf文件
参考资料: http://blog.163.com/yangjun1988422@126/blog/static/47412917201074446054/ vs2010中臃肿的ipch和sd ...
- 2014MadCon厦门分享会-笔记(下)
32 <如何与百度互动,不知道这些就不要做SEO了>百度站长平台资深产品运营师 曹丽丽(飞鸟) 33 注意百度站长平台的提醒.如果你不留电话,不留其他联系方式,出问题了,百度怎么提醒你呢? ...