矩阵乘法调不出来了求助
  • 板块P4314 CPU 监控
  • 楼主OrezTsim
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/2 21:32
  • 上次更新2023/11/3 09:10:10
查看原帖
矩阵乘法调不出来了求助
487752
OrezTsim楼主2023/11/2 21:32

Genshin 里面的 v[0] 表示区间历史最大值,v[1] 表示区间最大值,v[2]=0,然后正常矩乘。

#include<bits/stdc++.h>
#define ls ((rt)<<1)
#define rs ((rt)<<1|1)
#define int long long
using namespace std;

const int N=1e5+10,inf=0xcfcfcfcfcfcfcfcf;
int n,q,a[N];

struct Matrix {
    int v[3][3];
    void cl() { memset(v,0,sizeof(v)); }
    Matrix() { memset(v,0,sizeof(v)); }
    int *operator [](const int x) { return v[x]; }
    friend Matrix operator *(Matrix x,Matrix y) {
        Matrix res;
        res[0][0]=max({x[0][0]+y[0][0],x[0][1]+y[1][0],x[0][2]+y[2][0]});
        res[0][1]=max({x[0][0]+y[0][1],x[0][1]+y[1][1],x[0][2]+y[2][1]});
        res[0][2]=max({x[0][0]+y[0][2],x[0][1]+y[1][2],x[0][2]+y[2][2]});
        res[1][0]=max({x[1][0]+y[0][0],x[1][1]+y[1][0],x[1][2]+y[2][0]});
        res[1][1]=max({x[1][0]+y[0][1],x[1][1]+y[1][1],x[1][2]+y[2][1]});
        res[1][2]=max({x[1][0]+y[0][2],x[1][1]+y[1][2],x[1][2]+y[2][2]});
        res[2][0]=max({x[2][0]+y[0][0],x[2][1]+y[1][0],x[2][2]+y[2][0]});
        res[2][1]=max({x[2][0]+y[0][1],x[2][1]+y[1][1],x[2][2]+y[2][1]});
        res[2][2]=max({x[2][0]+y[0][2],x[2][1]+y[1][2],x[2][2]+y[2][2]});
        return res;
    }
    friend void operator *=(Matrix &x,Matrix y) { x=x*y; }
};

struct Genshin {
    int v[3];
    void cl() { memset(v,0,sizeof(v)); }
    Genshin() { memset(v,0,sizeof(v)); }
    int &operator [](int x) { return v[x]; }
    friend Genshin operator +(Genshin x,Genshin y) {
        Genshin res;
        res[0]=max(x[0],y[0]);
        res[1]=max(x[1],y[1]);
        return res;
    }
    friend Genshin operator *(Genshin x,Matrix y) {
        Genshin res;
        res[0]=max({x[0]+y[0][0],x[1]+y[1][0],x[2]+y[2][0]});
        res[1]=max({x[0]+y[0][1],x[1]+y[1][1],x[2]+y[2][1]});
        res[2]=max({x[0]+y[0][2],x[1]+y[1][2],x[2]+y[2][2]});
        return res;
    }
    friend void operator *=(Genshin &x,Matrix y) { x=x*y; }
};

struct Node { Genshin val; Matrix tag; bool vis; } t[N<<2];
void pushdown(int rt) {
    if(!t[rt].vis) return;
    t[ls].val*=t[rt].tag,t[rs].val*=t[rt].tag;
    t[ls].tag*=t[rt].tag,t[rs].tag*=t[rt].tag;
    t[ls].vis=true,t[rs].vis=true;
    t[rt].vis=false,t[rt].tag.cl();
}

void upd(int rt,int l,int r,int L,int R,Matrix v) {
    if(L<=l&&r<=R) {
        t[rt].val=t[rt].val*v;
        t[rt].tag=t[rt].tag*v;
        return t[rt].vis=true,void();
    }
    int mid=(l+r)>>1; pushdown(rt);
    if(L<=mid) upd(ls,l,mid,L,R,v);
    if(R>mid) upd(rs,mid+1,r,L,R,v);
    t[rt].val=t[ls].val+t[rs].val;
}

int qryh(int rt,int l,int r,int L,int R) {
    if(L<=l&&r<=R) return t[rt].val[0];
    int mid=(l+r)>>1,res=inf; pushdown(rt);
    if(L<=mid) res=max(res,qryh(ls,l,mid,L,R));
    if(R>mid) res=max(res,qryh(rs,mid+1,r,L,R));
    return res;
}

int qrym(int rt,int l,int r,int L,int R) {
    if(L<=l&&r<=R) return t[rt].val[1];
    int mid=(l+r)>>1,res=inf; pushdown(rt);
    if(L<=mid) res=max(res,qrym(ls,l,mid,L,R));
    if(R>mid) res=max(res,qrym(rs,mid+1,r,L,R));
    return res;
}

void build(int rt,int l,int r) {
    if(l==r) return t[rt].val[0]=t[rt].val[1]=a[l],void();
    int mid=(l+r)>>1; build(ls,l,mid),build(rs,mid+1,r);
    t[rt].val=t[ls].val+t[rs].val;
}

void solve() {
    char op; int x,y,z;
    cin>>op>>x>>y;
    if(op=='Q') return cout<<qrym(1,1,n,x,y)<<"\n",void();
    if(op=='A') return cout<<qryh(1,1,n,x,y)<<"\n",void();
    cin>>z;
    if(op=='P') {
        Matrix v;
        memset(v.v,0xcf,sizeof(v.v));
        v[0][0]=v[1][1]=z,v[2][2]=0;
        return upd(1,1,n,x,y,v),void();
    }
    Matrix v;
    memset(v.v,0xcf,sizeof(v.v));
    v[2][0]=v[2][1]=z,v[0][0]=v[2][2]=0;
    upd(1,1,n,x,y,v);
}

signed main() {
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n; for(int i=1;i<=n;++i) cin>>a[i];
    build(1,1,n),cin>>q;
    while(q--) solve();
    return 0;
}
2023/11/2 21:32
加载中...