分块st表 MLE 80 pts 求条
查看原帖
分块st表 MLE 80 pts 求条
664034
_xxxxx_楼主2025/2/5 11:38

qwq 调不动了。

#include <bits/stdc++.h>
#define int unsigned long long
const int N = 2e7 + 10;
using namespace std;
namespace GenHelper
{
    unsigned z1,z2,z3,z4,b;
    unsigned rand_()
    {
    b=((z1<<6)^z1)>>13;
    z1=((z1&4294967294U)<<18)^b;
    b=((z2<<2)^z2)>>27;
    z2=((z2&4294967288U)<<2)^b;
    b=((z3<<13)^z3)>>21;
    z3=((z3&4294967280U)<<7)^b;
    b=((z4<<3)^z4)>>12;
    z4=((z4&4294967168U)<<13)^b;
    return (z1^z2^z3^z4);
    }
}
void srand_(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
int read()
{
    using namespace GenHelper;
    int a=rand_()&32767;
    int b=rand_()&32767;
    return a*32768+b;
}
// inline int read()
// {
//     int s = 0, w = 1;
//     char ch = getchar();
//     while(ch < '0' || ch > '9'){if(ch == '-'){w = -1;} ch = getchar();}
//     while(ch >= '0' && ch <= '9'){s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();}
//     return s * w;
// }
int n, m, s;
int a[N];
int st[5000][15];
int lg[N], blo;
int get_id(int x){return (x + blo - 1) / blo;}
int pre[N], suf[N];
int sumaa(int l, int r)
{
    int sum = a[l];
    // for(int i = l; i <= r; i++) sum += a[i];//抽象
    for(int i = l; i <= r; i++) sum = max(a[i], sum);
    return sum;
}
signed main()
{
    cin >> n >> m >> s;
    srand_(s);
    blo = sqrt(n);
    for(int i = 1; i <= n; i++) a[i] = read(), st[get_id(i)][0] = max(a[i], st[get_id(i)][0]);
    for(int i = 2; i <= n; i++) lg[i] = log2(i);
    for(int j = 1; j <= lg[get_id(n)]; j++)
    {
        for(int i = 1; i + (1 << j) - 1 <= get_id(n); i++)
        {
            st[i][j] = max(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
        }
    }
    for(int i = 1; i <= n; i++)
    {
        if(i % blo != 1) pre[i] = max(a[i], pre[i - 1]);
        else pre[i] = a[i];
    }
    for(int i = n; i ; i--)
    {
        if(i % blo) suf[i] = max(a[i], suf[i + 1]);
        else suf[i] = a[i];
    }
    int ans = 0;
    while(m--)
    {
        int l = read() % n + 1, r = read() % n + 1;
        if(l > r) swap(l, r);
        int lid = get_id(l), rid = get_id(r);
        if(lid == rid) ans += sumaa(l, r);
        else if(lid == rid - 1) ans += max(suf[l], pre[r]);
        else
        {
            int k = lg[rid - lid - 1];
            int num = max(st[lid + 1][k], st[rid - (1 << k)][k]);
            ans += max(num, max(suf[l], pre[r]));
        }
    }
    cout << ans << endl;
    return 0;
}

2025/2/5 11:38
加载中...