Logo dfdf_maoshenxing的博客

博客

魔法阵(样例没过,输出7200)

2024-03-31 21:01:58 By dfdf_maoshenxing
#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353;
int tr[10][100005];
int tag[10][100005];
int jin[100005];
int mu[100005];
int shui[100005];
int huo[100005];
int tu[100005];
int n;
int m;
void build(int k, int l, int r)
{
    tag[1][k] = 0;
    tag[2][k] = 0;
    tag[3][k] = 0;
    tag[4][k] = 0;
    tag[5][k] = 0;
    if(l == r)
    {
        tr[1][k] = jin[l];
        tr[2][k] = mu[l];
        tr[3][k] = shui[l];
        tr[4][k] = huo[l];
        tr[5][k] = tu[l];
        return;
    }
    int mid = l+r>>1;
    build(k<<1, l, mid);
    build(k<<1|1, mid+1, r);
    tr[1][k] = tr[1][k<<1]+tr[1][k<<1|1]%mod;
    tr[2][k] = tr[2][k<<1]+tr[2][k<<1|1]%mod;
    tr[3][k] = tr[3][k<<1]+tr[3][k<<1|1]%mod;
    tr[4][k] = tr[4][k<<1]+tr[4][k<<1|1]%mod;
    tr[5][k] = tr[5][k<<1]+tr[5][k<<1|1]%mod;
}
void add(int k, int l, int r, int v, int z)
{
    tag[z][k] += v%mod;
    tr[z][k] += (r-l+1)*v%mod;
    return;
}
void pushdown(int k, int l, int r, int mid, int z)
{
    if(tag[z][k] == 0)
    {
        return;
    }
    add(k<<1,l,mid,tag[z][k],z);
    add(k<<1|1,mid+1,r,tag[z][k],z);
    tag[z][k] = 0;
}
void Add(int k, int l, int r, int x, int y, int v, int z)
{
    if(l>=x&&r<=y)
    {
        return add(k,l,r,v,z);
    }
    int mid = l+r>>1;
    pushdown(k, l, r, mid, z);
    if(x<=mid)
    {
        Add(k<<1,l,mid,x,y,v,z);
    }
    if(mid<y)
    {
        Add(k<<1|1,mid+1,r,x,y,v,z);
    }
    tr[z][k] = tr[z][k<<1]+tr[z][k<<1|1]%mod;
    return;
}
int q(int k, int l, int r, int x, int y)
{
    cout<<l<<' '<<r<<":"<<tr[1][k]*tr[2][k]%mod*tr[3][k]%mod*tr[4][k]%mod*tr[5][k]%mod<<endl;
    if(l>=x&&r<=y)
    {
        return tr[1][k]*tr[2][k]%mod*tr[3][k]%mod*tr[4][k]%mod*tr[5][k]%mod;
    }
    int mid = l+r>>1;
    int res = 0;
    pushdown(k,l,r,mid,1);
    pushdown(k,l,r,mid,2);
    pushdown(k,l,r,mid,3);
    pushdown(k,l,r,mid,4);
    pushdown(k,l,r,mid,5);
    if(x<=mid)
    {
        res+=q(k<<1,l,mid,x,y)%mod;
    }
    if(mid<y)
    {
        res+=q(k<<1|1,mid+1,r,x,y)%mod;
    }
    return res%mod;
}
int main()
{
    cin>>n;
    for(int i = 1; i<=n; i++)
    {
        cin>>jin[i]>>mu[i]>>shui[i]>>huo[i]>>tu[i];
    }
    build(1,1,n);
    cin>>m;
    for(int i = 1; i<=m; i++)
    {
        char op;
        int l;
        int r;
        cin>>op>>l>>r;
        if(op == 'J')
        {
            int x;
            cin>>x;
            Add(1,1,n,l,r,x,1);
        }
        if(op == 'M')
        {
            int x;
            cin>>x;
            Add(1,1,n,l,r,x,2);
        }
        if(op == 'S')
        {
            int x;
            cin>>x;
            Add(1,1,n,l,r,x,3);
        }
        if(op == 'H')
        {
            int x;
            cin>>x;
            Add(1,1,n,l,r,x,4);
        }
        if(op == 'T')
        {
            int x;
            cin>>x;
            Add(1,1,n,l,r,x,5);
        }
        if(op == 'Q')
        {
            cout<<q(1,1,n,l,r)<<endl;
        }
    }
    return 0;
}

评论

caxx_shaozenan
@dfdf_maoshenxing 建议先去康康题解……这样完全不行哒。
dfdf_maoshenxing
@dfdf_xuziye 第二题过了么?
dfdf_maoshenxing
第五题是不是平衡树