Codeforces679E. Bear and Bad Powers of 42
今天子帧的一套模拟题的T3。
考试的时候其实已经想到了正解了,但是一些地方没有想清楚,就没敢写,只打了个暴力。
首先考虑用线段树维护区间信息。
先把每个值拆成两个信息,一是距离他最近的且大于他的$42$的整次幂,而是到距离他最近的且大于他的$42$的整次幂的距离。
操作1和操作2不需要细说。
对于操作3,每次加入一个数后check整棵线段树的Min,如果出现负数就逐个升级。如果出现了0就再次增加,直到不出现0为止。
因为每个数最多升级$logN$次,所以时间上是没有问题的。
另一个小细节(被卡了很长时间),在每次下传操作2的lazytag之前要先将下一个的操作3的lazytag清空。
//Codeforces 679E //by Cydiater //2017.1.20 #include <iostream> #include <queue> #include <map> #include <ctime> #include <cstring> #include <string> #include <cmath> #include <ctime> #include <iomanip> #include <cstdlib> #include <cstdio> #include <bitset> #include <set> #include <vector> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define cmax(a,b) a=max(a,b) #define cmin(a,b) a=min(a,b) #define FILE "bad42" const int MAXN=2e5+5; inline int read(){ char ch=getchar();int x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ll pw[MAXN],N,M,arr[MAXN]; //little tool ll Level(ll num){up(i,0,11)if(pw[i]>=num)return i;} ll Dist(ll num){up(i,0,11)if(pw[i]>=num)return pw[i]-num;} struct tree{ ll Min,tag1,tag2,level; //tag1 -> opt2 //tag2 -> opt3 }t[MAXN<<2]; namespace SegmentTree{ inline void reload(int root){t[root].Min=min(t[root<<1].Min,t[root<<1|1].Min);} inline void Uplevel(int root){ ll num=pw[t[root].level]-t[root].Min; t[root].level=Level(num); t[root].Min=Dist(num); } inline void Pushdown(int leftt,int rightt,int root){ if(t[root].tag1>0){ if(leftt!=rightt){ t[root<<1].level=Level(t[root].tag1); t[root<<1].Min=Dist(t[root].tag1); t[root<<1].tag1=t[root].tag1; t[root<<1].tag2=0; t[root<<1|1].level=Level(t[root].tag1); t[root<<1|1].Min=Dist(t[root].tag1); t[root<<1|1].tag1=t[root].tag1; t[root<<1|1].tag2=0; } t[root].tag1=0; } if(t[root].tag2>0){ if(leftt!=rightt){ t[root<<1].Min-=t[root].tag2; t[root<<1].tag2+=t[root].tag2; t[root<<1|1].Min-=t[root].tag2; t[root<<1|1].tag2+=t[root].tag2; } t[root].tag2=0; } } void Build(int leftt,int rightt,int root){ if(leftt==rightt){ t[root].Min=Dist(arr[leftt]);t[root].level=Level(arr[leftt]); t[root].tag1=-1;t[root].tag2=0; return; } int mid=(leftt+rightt)>>1; t[root].tag1=-1;t[root].tag2=0; Build(leftt,mid,root<<1); Build(mid+1,rightt,root<<1|1); reload(root); } ll Realnum(int leftt,int rightt,int root,int pos){ Pushdown(leftt,rightt,root); if(leftt==rightt||t[root].tag1==0) return pw[t[root].level]-t[root].Min; int mid=(leftt+rightt)>>1; if(mid>=pos) return Realnum(leftt,mid,root<<1,pos); else if(mid+1<=pos) return Realnum(mid+1,rightt,root<<1|1,pos); } void Modify(int leftt,int rightt,int root,int L,int R,int val,int tag){ Pushdown(leftt,rightt,root); int mid=(leftt+rightt)>>1; if(leftt>=L&&rightt<=R){ if(tag==1){ t[root].tag1=val; t[root].level=Level(val); t[root].Min=Dist(val); } else{ t[root].tag2=val; t[root].Min-=val; } return; } t[root].tag1=-1; if(L>=mid+1) Modify(mid+1,rightt,root<<1|1,L,R,val,tag); else if(R<=mid) Modify(leftt,mid,root<<1,L,R,val,tag); else{ Modify(leftt,mid,root<<1,L,R,val,tag); Modify(mid+1,rightt,root<<1|1,L,R,val,tag); } reload(root); } void fix(int leftt,int rightt,int root){ Pushdown(leftt,rightt,root); if(leftt==rightt||t[root].tag1==0){ Uplevel(root); return; } int mid=(leftt+rightt)>>1; if(t[root<<1].Min<0) fix(leftt,mid,root<<1); if(t[root<<1|1].Min<0) fix(mid+1,rightt,root<<1|1); reload(root); } }using namespace SegmentTree; namespace solution{ void Prepare(){ pw[0]=1; up(i,1,11)pw[i]=pw[i-1]*42LL; N=read();M=read(); up(i,1,N)arr[i]=read(); Build(1,N,1); } void Solve(){ while(M--){ int opt=read(); if(opt==1){ int pos=read(); printf("%I64d\n",Realnum(1,N,1,pos)); } if(opt==2){ int L=read(),R=read(),val=read(); Modify(1,N,1,L,R,val,1); } if(opt==3){ int L=read(),R=read(),val=read(); do{ Modify(1,N,1,L,R,val,2); //printf("%d\n",Realnum(1,N,1,1)); if(t[1].Min<0)fix(1,N,1); }while(t[1].Min==0); } //up(i,1,N)printf("%d ",Realnum(1,N,1,i));puts(""); } } } int main(){ //freopen("input.in","r",stdin); //freopen("out1.out","w",stdout); //freopen(FILE".in","r",stdin); //freopen(FILE".out","w",stdout); using namespace solution; Prepare(); Solve(); return 0; }
Codeforces679E. Bear and Bad Powers of 42的更多相关文章
- CF679E Bear and Bad Powers of 42
一段时间不写线段树标记,有些生疏了 codeforces 679e Bear and Bad Powers of 42 - CHADLZX - 博客园 关键点是:42的次幂,在long long范围内 ...
- 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 ...
随机推荐
- 【BZOJ1857】[Scoi2010]传送带 三分套三分
[BZOJ1857][Scoi2010]传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度 ...
- android-修改TextView中部分文字的颜色
:
- Java构建网站多级菜单功能解决方案
在网站开发的时候我们会对网站的栏目进行分类,一个栏目可以有多个子分类,一个子分类又可以有分裂,例如:新闻栏目下有每日早报和每日晚报两个栏目,其中每日早报下面又分为上海早报,北京早报,杭州早报,下面是京 ...
- 深入分析Cocos2d-x 2.0中的“纹理”
对CCImage的绘制是通过CCTexture2D来实现的(OPENGL es)通过纹理绘制到某个面. (本文中所提到的方法在cocos2d2.0中部分有调整,请应用时候具体察看源码)1. 首先来了解 ...
- Python全栈day20(装饰器基本理论)
一,什么是装饰器 装饰器:本质就是函数,功能是为其他函数添加附加功能 原则 1,不修改被修饰函数的源代码 2,不修改被修饰函数的调用方式 举例说明:有一个求和函数要求就算出函数的运行时间 正常代码应该 ...
- HDU3231 Box Relations——三维拓扑排序
HDU3231 Box Relations 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3231 题目意思:在一个三维空间上有一些棱和坐标轴平行的立方 ...
- JavaScript中的原型与原型链
一直对JavaScript的原型与继承不了解,参考<JavaScript权威指南(第六版)>和<JavaScript高级程序设计(第三版)>对这个点的知识做个整理,方便自己记忆 ...
- 转:java高并发学习记录-死锁,活锁,饥饿
死锁 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 为什么会产生死锁: ① 因为系统资源不足. ② 进程运行推进的顺序不合适. ③ ...
- python 递归深度优先搜索与广度优先搜索算法模拟实现
一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件2.找出这一次和上一次关系3.假设当前 ...
- img 标签注意 默认img标签,有一个1px的边框 img{ border: 0; }
默认img标签,有一个1px的边框 img{ border: 0; }