首页 > 其他分享 >Bear and Bad Powers of 42 题解

Bear and Bad Powers of 42 题解

时间:2025-01-22 23:42:56浏览次数:1  
标签:10 le return log int 题解 42 Bad

题目描述

定义一个正整数是坏的,当且仅当它是 \(42\) 的幂次,否则它是好的。

给定长为 \(n\) 的序列 \(a_i\) ,保证初始所有数都是好的。

接下来 \(q\) 次操作:

  • 1 i :查询 \(a_i\) 。
  • 2 l r x :将 \(a_l,\cdots,a_r\) 赋值为一个好的数 \(x\) 。
  • 3 l r x :将 \(a_l,\cdots,a_r\) 加上 \(x\) ,重复这一操作直到所有数都变好。

数据范围

  • \(1\le n,q\le 10^5\) 。
  • \(2\le a_i\le 10^9,1\le x\le 10^9\) 。

时间限制 \(\texttt{5s}\) ,空间限制 \(\texttt{256MB}\) 。

分析

势能线段树经典题目。

值域大约是 \(v=nq=10^{14}\) 级别,坏的数不超过 \(\log_{42}v=8\) 个。

定义势能 \(\varphi\) 为线段树所有节点的坏数个数之和,则 \(\varphi\le 8n\log n\) 。

对线段树每个节点,维护 \(val\) 表示区间内 \(a_i\) 到下一个坏数的最短距离,操作二直接打标记,操作三如果 \(x\lt val\) 也可以打标记,否则暴力递归,以 \(1\) 的代价让 \(\varphi\) 减少 \(1\) 。

时间复杂度 \(\mathcal O(n\log_{42}v+q)\log n\) 。

#include<bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1
using namespace std;
const int maxn=1e5+5;
int n,q;
int a[maxn];
struct node
{
    int l,r;
    int add,cov,val;
}f[4*maxn];
int get(int x)
{
    for(int i=1;;i*=42) if(i>=x) return i-x;
}
void pushcov(int p,int v)
{
    f[p].add=0,f[p].cov=v,f[p].val=get(v);
}
void pushadd(int p,int v)
{
    if(f[p].cov) return pushcov(p,f[p].cov+v);
    assert(v<f[p].val);
    f[p].add+=v,f[p].val-=v;
}
void pushdown(int p)
{
    if(f[p].cov) pushcov(ls,f[p].cov),pushcov(rs,f[p].cov),f[p].cov=0;
    if(f[p].add) pushadd(ls,f[p].add),pushadd(rs,f[p].add),f[p].add=0;
}
void pushup(int p)
{
    f[p].val=min(f[ls].val,f[rs].val);
}
void build(int p,int l,int r)
{
    f[p].l=l,f[p].r=r;
    if(l==r) return f[p].cov=a[l],f[p].val=get(a[l]),void();
    int mid=(l+r)>>1;
    build(ls,l,mid),build(rs,mid+1,r);
    pushup(p);
}
void modify(int p,int l,int r,int x)
{
    if(l>f[p].r||r<f[p].l) return ;
    if(l<=f[p].l&&f[p].r<=r) return pushcov(p,x);
    pushdown(p);
    modify(ls,l,r,x),modify(rs,l,r,x);
    pushup(p);
}
void update(int p,int l,int r,int x)
{
    if(l>f[p].r||r<f[p].l) return ;
    if(l<=f[p].l&&f[p].r<=r&&(x<f[p].val||f[p].cov)) return pushadd(p,x);
    pushdown(p);
    update(ls,l,r,x),update(rs,l,r,x);
    pushup(p);
}
int query(int p,int pos)
{
    if(f[p].l==f[p].r) return f[p].cov;
    int mid=(f[p].l+f[p].r)>>1;
    pushdown(p);
    return query(pos<=mid?ls:rs,pos);
}
signed main()
{
    scanf("%lld%lld",&n,&q);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    build(1,1,n);
    for(int op=0,l=0,r=0,x=0;q--;)
    {
        scanf("%lld",&op);
        if(op==1) scanf("%lld",&x),printf("%lld\n",query(1,x));
        if(op==2) scanf("%lld%lld%lld",&l,&r,&x),modify(1,l,r,x);
        if(op==3)
        {
            scanf("%lld%lld%lld",&l,&r,&x);
            do update(1,l,r,x);
            while(!f[1].val);
        }
    }
    return 0;
}

标签:10,le,return,log,int,题解,42,Bad
From: https://www.cnblogs.com/peiwenjun/p/18686953

相关文章

  • [ARC178C] Sum of Abs 2 题解
    首先想到能不能用差分搞搞,但是给自己绕进去了/kel我们不妨给\(\{b_L\}\)定个不降的序(如果打在数轴上,显然序和答案无关),于是可以拿掉绝对值。注意到这个和式(记其结果为\(x\))中每个\(b_i\)的贡献系数\(c_i=2i-L-1\),于是有:\[x=\sum_{i=1}^{L}b_ic_i\]直接做不......
  • CF2061G Kevin and Teams 题解
    题目描述这是一道交互题。\(T\)组数据,一张\(n\)个点的无向完全图,边权\(\in\{0,1\}\),边权未知。你需要先输出最大的\(k\),满足无论每条边的边权是什么,都能找出\(2k\)个不同的点\(\{u_1,\cdots,u_n,v_1,\cdots,v_n\}\),使得边\((u_i,v_i)\)的权值同时为\(0\)或同时......
  • Codeforces Round 998 (Div. 3)(部分题解)
    补题链接A. Fibonacciness思路:了解清楚题意,求得是最大的斐波那契的度,数组只有5个数(最多度为3),能列出其对应的式子 或 或#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intn,m,k;vector<int>a(4);set<int>s;......
  • 题解:洛谷 P1803 凌乱的yyy / 线段覆盖
    题目https://www.luogu.com.cn/problem/P1803题目大意给定  条线段,第  条线段放在位置 ,现在你需要从这些线段中拿出一些,使得剩下的线段不会重叠。思路考虑贪心。可以发现,按照左端点从小到大排序毫无意义(虽然样例能过)。因此考虑按右端点从小到大排序。然后尽量多放......
  • AtCoder ABC326C 题解
    题目链接问题陈述Takahashi在数字线上放置了\(N\)个礼物。第\(i\)个礼物放置在坐标\(A_i\)处。您将在数轴上选择长度为\(M\)的半开区间\([x,x+M)\),并获得其中包含的所有礼物。更具体地说,你根据以下程序获得礼物。首先,选择一个实数\(x\)。然后,获取坐标满足\(......
  • C. Game of Mathletes(题解)
    首先Alice擦一个数a,然后Bob再擦一个数b,只有当a+b=k的时候才可以得分,Alice想要最小化分数而Bob想要最大化分数,所以如果给定的数中存在两个数的和为k,那么当Alice擦掉其中一个的时候Bob一定会擦掉另一个来得分,而且题目给定的数组长度为偶数,所以我们只需要运用双指针的思想找到数组......
  • Weblogic - V10.0.2 ~V10.3.6 - uddi 组件 SSRF 漏洞 - CVE-2014-4210
    0x01:漏洞简介Weblogic的uddi组件存在一个SSRF漏洞。利用该漏洞,攻击者可发送任意HTTP请求,进而对内网中的脆弱组件(redis、fastcgi)进行进一步的攻击。漏洞点:/uddiexplorer/(无需登录即可访问)0x02:影响版本Weblogic10.0.2~Weblogic10.3.60x03:环境搭建环境准备......
  • 常见问题解决 --- 引用的账户当前已锁定,且可能无法登录什么意思
     当你在尝试登录Windows系统时,看到错误提示“引用的账户当前已锁定,且可能无法登录”,这意味着你使用的用户账户由于多次输入错误的密码而被系统锁定。这是一种安全机制,旨在防止暴力破解或未经授权的访问。原因分析1.多次输入错误密码:如果连续多次输入错误的密码,系统会自......
  • 题解:P11600 『Fwb』流星の陨落
    『Fwb』流星の陨落题目描述流星雨来了!当然,这场流星雨确确实实是Fwb设计的。Fwb在天空中放置了许多的流星,同时也在地面上放置了许多的烟花。当流星和烟花发生碰撞时,就会出现美丽而独特的风景。由于方便控制流星雨的发射,流星的发射是有规律的,这个发射的规律叫做流星间隔。我......
  • 「CF1437F」Emotional Fishermen 题解
    小水题一道Description有n\((n\le5000)\)个渔民,每个渔民钓了一条重\(a_i\)的鱼,渔民按任意顺序展示他们的鱼。若当前渔民的鱼的重量为\(x\),之前展示过的鱼的最大重量\(y\)。一个排列满足条件当且仅当对于每个\(x\),满足\(2y\lex\)或\(2x\ley\)。问有多少个排列满......