爲什麽塊長會影響我的輸齣
查看原帖
爲什麽塊長會影響我的輸齣
339966
Kusanagi_Nene楼主2025/1/21 18:56
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>

using namespace std;

const int maxn = 1e6 + 10;

#define int long long

int n, m;
int a[maxn];
int idx[maxn][2];
int ans[maxn];

int blo[maxn], siz;
struct query {
    int l, r;
    int id;
} q[maxn];
struct node {
    int val, pos;
} b[maxn];

int res, cnt[maxn];
void add(int x, int l, int r)
{
    res += cnt[x];
    cnt[idx[x][0]]++;
    cnt[idx[x][1]]++;
    if (idx[x][0] >= l && idx[x][0] <= r)
        res++;
    if (idx[x][1] >= l && idx[x][1] <= r)
        res++;
}
void del(int x, int l, int r)
{
    cnt[idx[x][0]]--;
    cnt[idx[x][1]]--;
    if (idx[x][0] >= l && idx[x][0] <= r)
        res--;
    if (idx[x][1] >= l && idx[x][1] <= r)
        res--;
    res -= cnt[x];
}

signed main()
{
    std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);
    
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i], b[i].val = a[i], b[i].pos = i;
    sort(b + 1, b + n + 1, [](const node& x, const node& y) {
        return x.val < y.val;
    });
    b[0].pos = 0, b[n + 1].pos = n + 1;
    for (int i = 1; i <= n; i++) {
        idx[b[i].pos][0] = b[i - 1].pos,
        idx[b[i].pos][1] = b[i + 1].pos;
        if (b[i].val - b[i - 1].val > b[i + 1].val - b[i].val && b[i + 1].pos <= n)
            idx[b[i].pos][0] = 0;
        if (b[i].val - b[i - 1].val < b[i + 1].val - b[i].val && b[i - 1].pos)
            idx[b[i].pos][1] = n + 1;
    }
    // for (int i = 1; i <= n; i++)
    // cout << idx[i][0] << " " << idx[i][1] << "\n";
    siz = sqrt(n);
    for (int i = 1; i <= m; i++)
        cin >> q[i].l >> q[i].r, q[i].id = i, blo[i] = (i - 1) / siz + 1;
    sort(q + 1, q + m + 1, [](const query& x, const query& y) {
        if (blo[x.l] != blo[y.l])
            return x.l < y.l;
        return (blo[x.l] & 1 ? x.r < y.r : x.r > y.r);
    });
    int sum = 0;
    for (int i = 1, l = q[1].l, r = q[1].l - 1; i <= m; i++) {
        int ql = q[i].l, qr = q[i].r;
        while (l < ql)
            del(l, l, r), l++;
        while (l > ql)
            --l, add(l, l, r);
        while (r < qr)
            ++r, add(r, l, r);
        while (r > qr)
            del(r, l, r), r--;
        // cout << res << "\n";
        sum += res * q[i].id;
    }
    cout << sum << "\n";
    return 0;
}

雖然都是 wa,但是爲什麽 wa 的地方不一樣?

2025/1/21 18:56
加载中...