제출 #876768

#제출 시각아이디문제언어결과실행 시간메모리
876768danikoynovReconstruction Project (JOI22_reconstruction)C++14
3 / 100
5037 ms82612 KiB
#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;
}

vector < int > down_list[maxm], up_list[maxm];
int to_left[maxn], to_right[maxn];

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 ++)
    {
        ///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);
    }
}
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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...