Gym 102875 A. Array —— 记录变化状态的线段树,有丶东西

This way

题意:

在这里插入图片描述

题解:

看到了幂次…如果要用二项式展开来做会很麻烦。然后发现其实总共的数不会超过30个,那么我们开线段树记录每个区间值为x的数有多少个,然后更新的话,直接记录每个数转移成了什么数(f数组的意义)
那么
num[root<<1][f[root][i]]=num[root<<1][i]
这样子去做就行了。
计算幂次的话,由于p不一定是个质数,直接取模会出错,并且如果在线段树里面快速幂的话,时间复杂度会很大,因此我们在输入k之后,如果op==3,将所有数的k次直接与处理出来。

#include<bits/stdc++.h>
using namespace std;
#define G if(++ip==ie)if(fread(ip=buf,1,SZ,stdin))
#define ri register int
#define iv inline void
using namespace std;
const int SZ=1<<19;
char buf[SZ],*ie=buf+SZ,*ip=ie-1;
inline int in(){
    G;while(*ip<'-')G;
    ri x=*ip&15;G;
    while(*ip>'-'){x*=10;x+=*ip&15;G;}
    return x;
}
const int N=1e5+5;
int p;
int num[N*4][35],f[N*4][35];
int tmp[35];
void push_down(int root){
    for(int i=0;i<p;i++)
        tmp[i]=num[root<<1][i],num[root<<1][i]=0;
    for(int i=0;i<p;i++)
        num[root<<1][f[root][i]]+=tmp[i];
        
    for(int i=0;i<p;i++)
        tmp[i]=num[root<<1|1][i],num[root<<1|1][i]=0;
    for(int i=0;i<p;i++){
        num[root<<1|1][f[root][i]]+=tmp[i];
        f[root<<1][i]=f[root][f[root<<1][i]];
        f[root<<1|1][i]=f[root][f[root<<1|1][i]];
    }
    for(int i=0;i<p;i++)
        f[root][i]=i;
}
int a[N];
void build(int l,int r,int root){
    for(int i=0;i<p;i++)
        f[root][i]=i;
    if(l==r){
        num[root][a[l]]=1;
        return ;
    }
    int mid=l+r>>1;
    build(l,mid,root<<1);
    build(mid+1,r,root<<1|1);
    for(int i=0;i<p;i++)
        num[root][i]=num[root<<1][i]+num[root<<1|1][i];
}
int quik(int a,int b){int ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
int mod[N];
int qpow[35];
void update(int l,int r,int root,int ql,int qr,int op,int v){
    
    if(l>=ql&&r<=qr){
        if(op==2){//mul
            for(int i=0;i<p;i++)
                tmp[i]=num[root][i],num[root][i]=0;
            for(int i=0;i<p;i++)
                num[root][mod[i*v]]+=tmp[i],f[root][i]=mod[f[root][i]*v];
        }
        else if(op==1){//add
            for(int i=0;i<p;i++)
                tmp[i]=num[root][i],num[root][i]=0;
            for(int i=0;i<p;i++)
                num[root][mod[(i+v)]]+=tmp[i],f[root][i]=mod[(f[root][i]+v)];
        }
        else if(op==3){//^k
            for(int i=0;i<p;i++)
                tmp[i]=num[root][i],num[root][i]=0;
            for(int i=0;i<p;i++)
                num[root][qpow[i]]+=tmp[i],f[root][i]=qpow[f[root][i]];
        }
        return ;
    }
    push_down(root);
    int mid=l+r>>1;
    if(mid>=ql)
        update(l,mid,root<<1,ql,qr,op,v);
    if(mid<qr)
        update(mid+1,r,root<<1|1,ql,qr,op,v);
    for(int i=0;i<p;i++)
        num[root][i]=num[root<<1][i]+num[root<<1|1][i];
}
int ans[35];
void query(int l,int r,int root,int ql,int qr){
    
    if(l>=ql&&r<=qr){
        for(int i=0;i<30;i++)ans[i]+=num[root][i];
        return ;
    }
    push_down(root);
    int mid=l+r>>1;
    if(mid>=ql)
        query(l,mid,root<<1,ql,qr);
    if(mid<qr)
        query(mid+1,r,root<<1|1,ql,qr);
}
int main()
{
        
    int n;
    n=in(),p=in();
    
    for(int i=1;i<=n;i++)
        a[i]=in(),a[i]%=p;
    for(int i=0;i<35*35;i++)
        mod[i]=i%p;
    build(1,n,1);
    int q;
    q=in();
    while(q--){
        int op,l,r,k;
        op=in(),l=in(),r=in(),k=in();
        if(op<=2)k%=p;
        else if(op==3){
            for(int i=0;i<p;i++)
                qpow[i]=quik(i,k);
        }
        if(op<=3)
            update(1,n,1,l,r,op,k);
        else {
            for(int i=0;i<p;i++)ans[i]=0;
            query(1,n,1,l,r);
            if(op==4){
                int sum=0;
                for(int i=0;i<p;i++)
                    sum=(sum+quik(i,k)*ans[i])%p;
                printf("%d\n",sum);
            }
            else {
                int sum=1;
                for(int i=0;i<p;i++)
                    sum=sum*quik(i,ans[i])%p;
                printf("%d\n",sum);
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
自2020年以来,自动驾驶汽车(Autonomous Vehicle)在这一领域取得了显著进展。 自动驾驶汽车通过使用先进的传感技术,如雷达、激光雷达和摄像头,以及深度学习和人工智能算法,实现了车辆的自主驾驶。它们能够感知周围环境,了解道路状况,并做出相应的决策和行驶动作,从而实现无需人类操控的车辆行驶。 自动驾驶汽车在2020年迅速崭露头角。它们的技术日益成熟,不断的实验和测试表明其在安全性和性能方面已经取得了显著的突破。虽然仍然存在一些挑战,比如在复杂城市环境中导航和处理紧急情况,但这些问题正经过不断的研究和改进来得以解决。 在未来,自动驾驶汽车有望在各个领域发挥重要作用。首先,它们将可以提高道路交通的安全性。由于自动驾驶车辆不受人类司机的疲劳、分心和驾驶误差的限制,它们的驾驶能力更为稳定和准确。其次,自动驾驶汽车还能够提高交通效率。通过与其他车辆实时通信和协同,它们可以避免交通堵塞和减少事故发生,从而减少交通拥堵和行车时间成本。 此外,自动驾驶汽车也将为交通出行带来便利和舒适性。乘客可以更轻松地进行其他活动,如工作、休息或娱乐,而不必担心驾驶问题。老年人和残障人士也将能够自由独立地出行,提高他们的生活质量。 综上所述,作为2020年的重要趋势,自动驾驶汽车具有广阔的应用前景。通过不断的创新和发展,它们将在道路交通安全、交通效率和出行体验方面取得进一步的提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值