TLE 20pts求调
查看原帖
TLE 20pts求调
905636
_xguagua_Firefly_楼主2024/10/15 16:28
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define reg register int
using namespace std;

const int MAXN = 2e5 + 24,MOD = 1e9 + 7;
int n,m,x,y,z,l,r,len,num,opt;
int a[MAXN],st[MAXN],ed[MAXN],bel[MAXN],sum[505],pref[505][505];
inline void init()
{
    len = 505,num = (n / len);
    if(n % len) num ++;
    for(reg i = 1;i <= num;i++)
    {
        st[i] = (i - 1) * len + 1;
        ed[i] = min(n,i * len);
    }
    for(reg i = 1;i <= n;i ++)
    {
        cin >> a[i];
        bel[i] = (i - 1) / len + 1;
        sum[bel[i]] += a[i];
    }
}
inline void modify(int x,int y,int z)
{
    if(x >= num)
    {
        for(reg i = y;i <= n;i += x)
        {
            a[i] += z;
            sum[bel[i]] += z;
        }
        return ;
    }
    for(reg i = y;i <= x;i++)
        pref[x][i] += z;
}
inline int query(int l,int r)
{
    int res = 0;
    int bl = bel[l],br = bel[r];
    if(bl == br)
    {
        for(reg i = l;i <= r;i++)
            res += a[i];
    }
    else
    {
        for(reg i = l;i <= ed[bl];i++)
            res += a[i];
        for(reg i = st[br];i <= r;i++)
            res += a[i];
        for(reg i = bl + 1;i <= br - 1;i++)
            res += sum[i];
    }
    for(reg i = 1;i <= num;i++)
        res += pref[i][r % i] - pref[i][(l - 1) % i] + pref[i][i] * ((r / i) - ((l - 1) / i));
    return res % MOD;
}
signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin >> n >> m;
    init();
    while(m--)
    {
        cin >> opt;
        if(opt == 1)
        {
            cin >> x >> y >> z;
            modify(x,y,z);
        }
        else
        {
            cin >> l >> r;
            cout << query(l,r) % MOD << endl;
        }
    }
    return 0;
}
2024/10/15 16:28
加载中...