萌新刚学OI,求助大水题
查看原帖
萌新刚学OI,求助大水题
223797
Remake_楼主2020/9/12 19:05

Rt,只对了一个点,但样例过了qwq,求查错

#include <bits/stdc++.h>
using namespace std;
long long n, m, l, r, opt;
long long a[1000005], k[1005], size;
long long awa(long long qwq)
{
    return qwq - floor(sqrt(qwq));
}
long long belong(long long qwq)
{
    return ceil(qwq * 1.0 / size);
}
void update()
{
    while (l % size != 1)
    {
        k[belong(l)] -= awa(a[l]);
        a[l] = floor(sqrt(a[l]));
        ++l;
    }
    while (r % size)
    {
        k[belong(r)] -= awa(a[r]);
        a[r] = floor(sqrt(a[r]));
        --r;
    }
    for (int i = belong(l); i <= belong(r); i++)
    {
        for (int j = 1; j <= size && k[i] > size; j++)
        {
            k[i] -= awa(a[(i - 1) * size + j]);
            a[(i - 1) * size + j] = sqrt(a[(i - 1) * size + j]);
        }
    }
}
long long query()
{
    long long ans = 0;
    while (l % size != 1)
    {
        ans += a[l];
        ++l;
    }
    while (r % size)
    {
        ans += a[r];
        --r;
    }
    for (int i = belong(l); i <= belong(r); i++)
        ans += k[i];
    return ans;
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    size = ceil(sqrt(n));
    for (int i = n + 1; i <= size * size; i++)
        a[i] = 1;
    for (int i = 1; i <= size; i++)
        for (int j = 1; j <= size; j++)
            k[i] += a[(i - 1) * size + j];
    cin >> m;
    for (int i = 1; i <= m; i++)
    {
        cin >> opt >> l >> r;
        if (l > r)
            swap(l, r);
        if (opt == 0)
            update();
        if (opt == 1)
            cout << query() << endl;
    }
}

谢谢诸位大佬,蒟蒻感激不尽

2020/9/12 19:05
加载中...