50pts,莫队TLE on#6~#10
查看原帖
50pts,莫队TLE on#6~#10
782609
Wmz1220楼主2025/1/26 20:11

为什么会超时!!!

code:

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cmath>

using namespace std;

const int N = 1e5 + 10, M = N;

int n, m, res = 0;
int a[N], pos[N], ans[M];
struct Q
{
    int l, r, id;
    
    bool operator <(const Q &t)const
    {
        return pos[l] == pos[t.l] ? r < t.r : pos[l] == pos[t.l];;
    }
}q[M];

inline void Add(register int x)
{
    res += a[x];
}

inline void Sub(register int x)
{
    res -= a[x];
}

template<typename T> inline void read(register T &qwq)
{
    register T x = 0, f = 1;
    register char ch = getchar();
    while (!isdigit(ch))
    {
        if (ch == '-')  
            f = -1;
        ch = getchar();
    }
    while (isdigit(ch))
        x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    qwq = x * f;
    return;
}

template<typename T> inline void write(register T x)
{
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
    return;
}

int main()
{
    read(n);
    
    register int sz = sqrt(n);
    for (register int i = 1; i <= n; i ++ )
        read(a[i]), pos[i] = i / sz;
        
    read(m);
    for (register int i = 1; i <= m; i ++ )
        read(q[i].l), read(q[i].r), q[i].id = i;
    
    register int l = 1, r = 0;
    for (register int i = 1; i <= m; i ++ )
    {
        while (l > q[i].l) Add( -- l);
        while (r < q[i].r) Add( ++ r);
        while (l < q[i].l) Sub(l ++ );
        while (r > q[i].r) Sub(r -- );
        
        ans[q[i].id] = res;
    }
    
    for (register int i = 1; i <= m; i ++ )
        write(ans[i]), puts("");
        
    return 0;
}

提交记录

2025/1/26 20:11
加载中...