QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#344980 | #2484. Screamers | PetroTarnavskyi | RE | 0ms | 0kb | C++20 | 3.8kb | 2024-03-05 22:09:46 | 2024-03-05 22:09:47 |
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 = max(r, (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: 0
Runtime Error
input:
4 6 1 2 2 3 1 3 1 4 3 4 2 4 4 1 1 1 3 2 4 1 6