QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#344686 | #2484. Screamers | PetroTarnavskyi# | RE | 0ms | 3892kb | C++20 | 3.8kb | 2024-03-04 21:22:18 | 2024-03-04 21:22:18 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define RFOR(i, a, b) for(int i = (a) - 1; i >= (b); i--)
#define SZ(a) int(a.size())
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second
typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef double db;
struct DSU
{
int n;
VI p, sz;
vector<int> vec;
void init(int _n)
{
n = _n;
p.resize(n);
iota(ALL(p), 0);
sz.assign(n, 1);
}
int find(int v)
{
if (v == p[v])
return v;
return find(p[v]);
}
bool unite(int u, int v)
{
u = find(u);
v = find(v);
if (u == v)
{
assert(false);
return false;
}
if (sz[u] > sz[v])
swap(u, v);
p[u] = v;
sz[v] += sz[u];
vec.PB(u);
return true;
}
void rollBack()
{
assert(!vec.empty());
int u = vec.back();
int v = p[u];
sz[v] -= sz[u];
p[u] = u;
vec.pop_back();
}
}d;
const int N = 100'447;
int f[N];
vector<PII> e;
void solve(int l, int r, int L, int R)
{
assert(L < R);
assert(l <= L);
assert(r <= R);
if (l == r)
return;
if (L + 1 == R)
{
FOR (i, l, r) f[i] = L;
return;
}
int M = (L + R) / 2;
int m = r;
if(L <= r)
{
m = M + 1;
RFOR(i, M + 1, l)
{
int a = e[i].F;
int b = e[i].S;
if(d.find(a) == d.find(b))
break;
m = i;
d.unite(a, b);
}
FOR(i, m, M + 1)
{
d.rollBack();
}
//assert(m <= r);
m = min(m, r);
}
else
{
int pos = L - 1;
FOR(i, L, M + 1)
{
int a = e[i].F;
int b = e[i].S;
if(d.find(a) == d.find(b))
break;
pos = i;
d.unite(a, b);
}
if(pos != M)
{
RFOR(i, pos + 1, L)
{
d.rollBack();
}
m = r;
}
else
{
m = r;
RFOR(i, r, l)
{
int a = e[i].F;
int b = e[i].S;
if(d.find(a) == d.find(b))
break;
m = i;
d.unite(a, b);
}
FOR(i, m, r)
{
d.rollBack();
}
}
}
if(L <= r)
{
if(m < L)
{
int cnt = 0;
FOR(i, m, L)
{
int a = e[i].F;
int b = e[i].S;
if(d.find(a) == d.find(b))
break;
cnt++;
d.unite(a, b);
}
if(cnt == L - m)
solve(l, m, L, M);
FOR(i, 0, cnt)
d.rollBack();
}
else
solve(l, m, L, M);
if(r < M)
{
int cnt = 0;
FOR(i, r, M)
{
int a = e[i].F;
int b = e[i].S;
if(d.find(a) == d.find(b))
break;
cnt++;
d.unite(a, b);
}
if(cnt == M - r)
solve(m, r, M, R);
FOR(i, 0, cnt)
d.rollBack();
}
else
solve(m, r, M, R);
}
else
{
int cnt = 0;
FOR(i, m, r)
{
int a = e[i].F;
int b = e[i].S;
if(d.find(a) == d.find(b))
break;
cnt++;
d.unite(a, b);
}
if(cnt == r - m)
solve(l, m, L, M);
FOR(i, 0, cnt)
d.rollBack();
cnt = 0;
FOR(i, L, M)
{
int a = e[i].F;
int b = e[i].S;
if(d.find(a) == d.find(b))
break;
cnt++;
d.unite(a, b);
}
if(cnt == M - L)
solve(m, r, M, R);
FOR(i, 0, cnt)
d.rollBack();
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
e.resize(m);
d.init(n);
FOR (i, 0, m)
{
cin >> e[i].F >> e[i].S;
e[i].F--, e[i].S--;
}
iota(f, f + m, 0);
solve(0, m, 0, m);
vector<LL> sum(m + 1);
FOR(i, 0, m)
sum[i + 1] = sum[i] + (f[i] - i + 1);
int q;
cin >> q;
while(q--)
{
int l, r;
cin >> l >> r;
l--;
int idx = lower_bound(f + l, f + r, r) - f;
LL ans = sum[idx] - sum[l];
//cout << idx << " " << ans << "\n";
ans += (r - idx) * (LL)(r - idx + 1) / 2;
cout << ans << "\n";
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3892kb
input:
4 6 1 2 2 3 1 3 1 4 3 4 2 4 4 1 1 1 3 2 4 1 6
output:
1 5 6 13
result:
ok 4 lines
Test #2:
score: 0
Accepted
time: 0ms
memory: 3596kb
input:
3 3 1 2 1 3 2 3 6 1 1 1 2 1 3 2 2 2 3 3 3
output:
1 3 5 1 3 1
result:
ok 6 lines
Test #3:
score: 0
Accepted
time: 0ms
memory: 3892kb
input:
4 6 1 2 1 3 1 4 2 3 2 4 3 4 21 1 1 1 2 1 3 1 4 1 5 1 6 2 2 2 3 2 4 2 5 2 6 3 3 3 4 3 5 3 6 4 4 4 5 4 6 5 5 5 6 6 6
output:
1 3 6 9 12 14 1 3 6 9 11 1 3 6 8 1 3 5 1 3 1
result:
ok 21 lines
Test #4:
score: -100
Runtime Error
input:
5 10 1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5 55 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2 10 3 3 3 4 3 5 3 6 3 7 3 8 3 9 3 10 4 4 4 5 4 6 4 7 4 8 4 9 4 10 5 5 5 6 5 7 5 8 5 9 5 10 6 6 6 7 6 8 6 9 6 10 7 7 7 8 7 9 7 10 8 8 8 9 8 10 9 9 9 10 10 10