- P213's solution
-
P213's Solution
- @ 2026-2-1 0:27:18
大家好啊,我用分块水过了这道题,代码跑的甚至比 std 还快。
#include <bits/stdc++.h>
using namespace std;
const int B1 = 320, B2 = 320, C1 = B1 + 12, C2 = B2 + 12, N = 1e5 + 12;
int a[N], b[C2][N], t[C2];
void push(int c)
{
if (!t[c]) return;
for (int i = 0; i < B1; i++)
{
b[c][a[c * B1 + i]] = 0;
a[c * B1 + i] = t[c];
}
b[c][t[c]] = B1;
t[c] = 0;
}
int get(int c, int v)
{
if (t[c] == v) return B1;
if (t[c] && t[c] != v) return 0;
return b[c][v];
}
void update(int x, int v)
{
b[x / B1][a[x]]--;
a[x] = v;
b[x / B1][v]++;
}
int main()
{
freopen("array.in", "r", stdin);
freopen("array.out", "w", stdout);
ios::sync_with_stdio(0);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
b[i / B1][a[i]]++;
}
while (q--)
{
int z, m, x, y, l, r, v, f = 0;
cin >> z;
if (z == 1)
{
cin >> l >> r >> v;
if (l / B1 == r / B1)
{
push(l / B1);
for (int i = l; i <= r; i++)
update(i, v);
continue;
}
push(l / B1);
for (int i = l; i < B1 * (l / B1 + 1); i++)
update(i, v);
for (int i = l / B1 + 1; i < r / B1; i++)
t[i] = v;
push(r / B1);
for (int i = r / B1 * B1; i <= r; i++)
update(i, v);
}
if (z == 2)
{
cin >> m;
while (m--)
{
cin >> x >> y;
if (f > n + 1) continue;
while (f % B1)
{
if (a[f] == x) y--;
f++;
if (!y) break;
if (f > n + 1) break;
}
if (!y) continue;
while (f <= n + 1 && y > get(f / B1, x))
{
y -= get(f / B1, x);
f += B1;
}
if (f > n + 1) continue;
push(f / B1);
while (y)
{
if (a[f] == x) y--;
f++;
}
}
if (f <= n + 1) puts("Yes");
if (f > n + 1) puts("No");
}
}
return 0;
}