QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#841368 | #3746. 千万别用树套树 | billf | AC ✓ | 840ms | 8744kb | C++20 | 2.8kb | 2025-01-03 17:35:25 | 2025-01-03 17:35:26 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = N;
int n, q, a[N], c[3][N];
mt19937 Rnd(1);
struct FHQ
{
int tot, lc[M], rc[M], siz[M], vl[M], rd[M], rt;
void pushup(int p)
{
siz[p] = siz[lc[p]] + siz[rc[p]] + 1;
}
void split(int p, int v, int &l, int &r)
{
if (!p)
return l = r = 0, void();
if (vl[p] <= v)
l = p, split(rc[p], v, rc[p], r);
else
r = p, split(lc[p], v, l, lc[p]);
pushup(p);
}
int merge(int p, int q)
{
if (!p || !q)
return p + q;
if (rd[p] < rd[q])
{
rc[p] = merge(rc[p], q);
pushup(p);
return p;
}
else
{
lc[q] = merge(p, lc[q]);
pushup(q);
return q;
}
}
int newn(int x)
{
tot++;
lc[tot] = rc[tot] = 0;
siz[tot] = 1;
vl[tot] = x;
rd[tot] = Rnd();
return tot;
}
void irt(int x)
{
int p, q;
split(rt, x, p, q);
rt = merge(merge(p, newn(x)), q);
}
void dlt(int x)
{
int p, q, p1, q1;
split(rt, x, p, q);
split(p, x - 1, p1, q1);
p = merge(lc[q1], rc[q1]);
rt = merge(merge(p1, p), q);
}
int grk(int x)
{
int p, q, res;
split(rt, x, p, q);
res = siz[p];
rt = merge(p, q);
return res;
}
int kth(int p, int x)
{
int lf = siz[lc[p]] + 1;
if (x == lf)
return vl[p];
if (x < lf)
return kth(lc[p], x);
else
return kth(rc[p], x - lf);
}
int ask(int x, int y)
{
if (!rt)
return 0;
int p, q, p1, q1;
split(rt, y, p, q);
split(p, x - 1, p1, q1);
int res = siz[q1];
rt = merge(merge(p1, q1), q);
return res;
}
} ll, rr;
int main()
{
while (scanf("%d%d", &n, &q) != EOF)
{
ll.tot = ll.rt = 0;
rr.tot = rr.rt = 0;
int all = 0;
while (q--)
{
int op, x, y, res = 0;
scanf("%d%d%d", &op, &x, &y);
if (op == 1)
{
if (y - x <= 2)
c[y - x][x]++;
else
ll.irt(y), rr.irt(x), all++;
}
else
{
res = all;
for (int i = y - x; i <= 2; i++)
{
for (int j = y - i; j <= x; j++)
res += c[i][j];
}
res -= ll.ask(-100, y - 1);
res -= rr.ask(x + 1, n + 100);
printf("%d\n", res);
}
}
for (int i : {0, 1, 2})
fill(c[i], c[i] + n + 1, 0);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 840ms
memory: 8744kb
input:
100000 100000 1 48500 63742 1 43673 89780 1 6471 44388 1 68054 71541 1 30056 91431 1 49687 70537 2 46899 46900 1 5165 57954 1 85892 88481 2 18060 18062 2 45289 45289 1 18927 67848 1 17389 96139 1 63451 92197 1 15473 87341 1 15162 15744 1 76728 99645 2 48730 48731 2 20886 20888 1 9756 67424 1 23175 4...
output:
2 2 3 7 5 8 9 4 6 2 11 13 13 10 13 15 9 10 14 16 17 16 16 15 2 4 11 6 11 12 23 9 26 3 28 20 12 12 22 30 5 27 6 29 10 14 27 6 17 15 9 30 20 34 7 36 15 8 32 16 21 40 19 2 1 12 12 39 37 13 19 20 1 9 37 1 41 40 20 34 45 43 27 30 47 29 13 50 41 44 29 35 38 53 2 46 54 36 56 58 45 32 42 26 52 42 60 1 4 25 ...
result:
ok 500497 numbers