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 ...
随机推荐
- Go语言中的一些函数
1.并行 通过使用goroutine和channel,go语言可以很好地支持并发,但是在我的电脑上是默认只使用一个核执行,要使用多核,在代码前面加入 import("runtime" ...
- jquery remove() detach() empty()三种方法的区别
remove方法把事件删除掉了,数据并没有删除 detach方法保存了事件和数据 empty方法保留了元素本身,移除子节点,删除内容 举例: <!DOCTYPE html><html ...
- [Chrome] 如何下载老版本的 Chrome
Google 官方只提供了最新版的 Chrome, 在旧版本的系统(如:Ubuntu 12.04 LTS)安装不上 这里提供了 Chrome 的历史版本下载 备注:Ubuntu 12.04 LTS 可 ...
- jenkins提交SVN文件
需求背景: 公司有内网和外网两台SVN服务器,都需要维护相同的配置文件,但是我们想能否在内网修改配置文件后同时提交到外网SVN服务器上. 开发人员操作步骤 1.开发人员在IDE中checkout内网c ...
- kibana5.6源码分析2
1.启动shell脚本:/bin/kibana; js脚本:/src/cli/cli.js; 2.服务端入口:/src/server/kbn_server.js.使用的web框架为hapi.js. ...
- C# 使用KingAOP面向切面编程
1. 在Nuget中安装KingAOP 2. 日志DEMO public class Test : IDynamicMetaObjectProvider { [LogAspec] public voi ...
- 2017 Multi-University Training Contest - Team 6—HDU6098&&HDU6106&&HDU6103
HDU6098 Inversion 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6098 题目意思:题目很短,给出一个数组,下标从1开始,现在输出一个 ...
- Apache Kafka源码分析 – ReplicaManager
如果说controller作为master,负责全局的事情,比如选取leader,reassignment等那么ReplicaManager就是worker,负责完成replica的管理工作 主要工作 ...
- UNIX或LINUX时间戳转时间
ORACLE: select TO_DATE('19700101', 'yyyymmdd') + 1481148929 / 86400 + TO_NUMBER(SUBSTR(TZ_OFFSET(ses ...
- web前端 微信支付之H5支付
一.什么是微信H5支付? 微信,简直是21世纪的社交产品之最.人们的生活已经离不开它,因为它的触角广泛蔓延像一张巨大无形的网,从而让我们的生活更加便捷高效,这款社交工具我们不做过多评价,但是我们要通过 ...