社区讨论

分块求卡常&&洛谷刚好卡在时限上的点是会T掉的

P3527[POI 2011] MET-Meteors参与者 6已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mmanbcol
此快照首次捕获于
2026/03/03 21:30
上周
此快照最后确认于
2026/03/06 21:30
4 天前
查看原帖
https://www.luogu.com.cn/record/265197470
CPP
#include <bits/stdc++.h>
#define maxn 300010
using namespace std;
#define int long long
const int N = 3e5 + 5;
int n, m, r, k, block;
int a[N], e[N], bl[N], siz[N], of[N], tot[N], qwq[N], nxt[N], res[N];
vector<int> ve[N];
struct node
{
    int l, r, k;
} q[N];
signed main()
{
    cin >> n >> m;
    for (register int i = 1; i <= m; i++)
    {
        int x;
        cin >> x;
        ve[x].push_back(i);
        siz[x]++;
        of[i] = x;
    }
    for (register int i = 1; i <= n; i++)
    {
        cin >> e[i];
    }
    cin >> k;
    block = sqrt(k) * 2.5;
    for (register int i = 1; i <= (k - 1) / block + 1; i++)
    {
        int l = (i - 1) * block + 1, r = min(k, i * block);
        for (register int j = l; j <= r; j++)
        {
            cin >> q[j].l >> q[j].r >> q[j].k;
            if (q[j].l > q[j].r)
            {
                qwq[q[j].l] += q[j].k, qwq[m + 1] -= q[j].k, qwq[1] += q[j].k, qwq[q[j].r + 1] -= q[j].k;
            }
            else
            {
                qwq[q[j].l] += q[j].k, qwq[q[j].r + 1] -= q[j].k;
            }
        }
        for (register int j = 1; j <= m; j++)
        {
            nxt[j] = qwq[j];
            nxt[j] += nxt[j - 1];
            res[of[j]] += nxt[j];
        }
        for (register int u = 1; u <= n; u++)
        {
            int pt = res[u];
            if (tot[u] || pt < e[u])
            {
                continue;
            }
            for (register int j = r; j >= l; j--)
            {
                for (register int xx = 0; xx < siz[u]; xx++)
                {
                    if (q[j].l <= q[j].r)
                    {
                        if (q[j].l <= ve[u][xx] && ve[u][xx] <= q[j].r)
                        {
                            pt -= q[j].k;
                        }
                    }
                    else if (q[j].l <= ve[u][xx] || ve[u][xx] <= q[j].r)
                    {
                        pt -= q[j].k;
                    }
                }
                if (pt < e[u])
                {
                    tot[u] = j;
                    break;
                }
            }
        }
        memset(res, 0, sizeof(res));
    }
    for(int i = 1; i <= n; i ++)
    {
        if (tot[i] == 0)
        {
            cout << "NIE" << endl;
        }
        else
        {
            cout << tot[i] << endl;
        }
    }
}

回复

7 条回复,欢迎继续交流。

正在加载回复...