莫队TLE,40pts,求助
查看原帖
莫队TLE,40pts,求助
782609
Wmz1220楼主2024/10/5 23:18
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cmath>

char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )

using namespace std;

const int N = 1000000 + 10, M = N;

int n, m, res = 0;
int a[N], pos[N], cnt[N];
int ans[M];

struct Q
{
    int l, r, k;
    
    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)
{
    if (!cnt[a[x]])
        res ++ ;
    cnt[a[x]] ++ ;
}

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

template<typename T> inline void read(register T &qwq)
{
    register T x = 0, f = 1;
    register char ch = nc();
    while (!isdigit(ch))
    {
        if (ch == '-')
            f = -1;
        ch = nc();
    }
    while (isdigit(ch))
        x = (x << 1) + (x << 3) + (ch ^ 48), ch = nc();
    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 siz = sqrt(n);
    for (register int i = 1; i <= n; i ++ )
        read(a[i]), pos[i] = i / siz;
        
    read(m);
    
    for (register int i = 1; i <= m; i ++ )
        read(q[i].l), read(q[i].r), q[i].k = i;
        
    sort(q + 1, q + 1 + m);
    
    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].k] = res;
    }
    
    for (register int i = 1; i <= m; i ++ )
        write(ans[i]), putchar('\n');
        
    return 0;
}

评测记录

2024/10/5 23:18
加载中...