이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const int maxn = 510, maxm = 1e5 + 10, maxq = 1e6 + 10;
const ll inf = 1e18;
struct edge
{
int v, u;
ll w;
edge(int _v = 0, int _u = 0, ll _w = 0)
{
v = _v;
u = _u;
w = _w;
}
bool operator < (const edge &e) const
{
return w < e.w;
}
}edges[maxm];
int n, m, q;
ll ans[maxq];
struct query
{
int idx;
ll x;
bool operator < (const query &q1) const
{
return x < q1.x;
}
}task[maxq];
void input()
{
cin >> n >> m;
for (int i = 1; i <= m; i ++)
{
cin >> edges[i].v >> edges[i].u >> edges[i].w;
}
cin >> q;
for (int i = 1; i <= q; i ++)
{
cin >> task[i].x;
task[i].idx = i;
}
sort(edges + 1, edges + m + 1);
sort(task + 1, task + q + 1);
}
int par[maxn];
int find_leader(int v)
{
return (par[v] == v) ? v : (par[v] = find_leader(par[v]));
}
bool unite(int v, int u)
{
v = find_leader(v);
u = find_leader(u);
if (v == u)
return false;
par[v] = u;
return true;
}
int to_left[maxm], to_right[maxm];
ll to_add[maxq], cnt_add[maxq];
void offline_mst()
{
for (int j = 1; j <= m; j ++)
{
for (int i = 1; i <= n; i ++)
par[i] = i;
int d = j + 1;
while(d <= m)
{
unite(edges[d].v, edges[d].u);
if (find_leader(edges[j].v) == find_leader(edges[j].u))
break;
d ++;
}
int left = edges[j].w, right = 1e9;
if (d <= m)
{
right = (edges[j].w + edges[d].w) / 2;
if ((edges[j].w + edges[d].w) % 2 == 0)
right --;
}
to_right[j] = right;
}
for (int j = 1; j <= m; j ++)
{
for (int i = 1; i <= n; i ++)
par[i] = i;
int d = j - 1;
while(d > 0)
{
unite(edges[d].v, edges[d].u);
if (find_leader(edges[j].v) == find_leader(edges[j].u))
break;
d --;
}
int right = edges[j].w, left = 0;
if (d > 0)
{
left = (edges[j].w + edges[d].w) / 2;
if ((edges[j].w + edges[d].w) % 2 == 1)
left ++;
}
to_left[j] = left;
}
for (int j = 1; j <= m; j ++)
{
int lf = 1, rf = q;
while(lf <= rf)
{
int mf = (lf + rf) / 2;
if (task[mf].x < to_left[j])
lf = mf + 1;
else
rf = mf - 1;
}
int lb = lf;
lf = 1;
rf = q;
while(lf <= rf)
{
int mf = (lf + rf) / 2;
if (task[mf].x <= to_right[j])
lf = mf + 1;
else
rf = mf - 1;
}
int rb = rf;
if (lb > rb)
continue;
lf = 1;
rf = q;
while(lf <= rf)
{
int mf = (lf + rf) / 2;
if (task[mf].x <= edges[j].w)
lf = mf + 1;
else
rf = mf - 1;
}
int mb = lf - 1;
to_add[lb] += edges[j].w;
cnt_add[lb] ++;
to_add[mb + 1] -= edges[j].w;
to_add[mb + 1] -= edges[j].w;
to_add[rb + 1] += edges[j].w;
cnt_add[mb + 1] --;
///cout << j << " : " << to_left[j] << " " << to_right[j] << endl;
//for (int i = 1; i <= q; i ++)
//if (task[i].x >= to_left[j] && task[i].x <= to_right[j])
//ans[task[i].idx] += abs(task[i].x - edges[j].w);
}
ll und = 0, sum = 0;
for (int i = 1; i <= q; i ++)
{
und += cnt_add[i];
sum += to_add[i];
ans[task[i].idx] = sum - und * task[i].x + (n - 1 - und) * task[i].x;
}
}
void answer()
{
for (int i = 1; i <= q; i ++)
cout << ans[i] << endl;
}
void solve()
{
input();
offline_mst();
answer();
}
void speed()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
int main()
{
speed();
solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
reconstruction.cpp: In function 'void offline_mst()':
reconstruction.cpp:97:13: warning: unused variable 'left' [-Wunused-variable]
97 | int left = edges[j].w, right = 1e9;
| ^~~~
reconstruction.cpp:121:13: warning: unused variable 'right' [-Wunused-variable]
121 | int right = edges[j].w, left = 0;
| ^~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |