Submission #1290082

#TimeUsernameProblemLanguageResultExecution timeMemory
1290082win1702Sightseeing (NOI14_sightseeing)C++20
25 / 25
2121 ms131876 KiB
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

#define MAXN 500005
#define INF 1000000001
#define MOD 1000000007
#define FOR(i, l, r) for (int i = l; i <= r; ++i)
#define FOD(i, r, l) for (int i = r; i >= l; i--)
#define fillchar(a, x) memset(a, x, sizeof(a))
#define rep(i, n) for (int i = 0, _n = (n); i < _n; ++i)
#define BIT(x,i) ((x>>i)&1)
#define MASK(i) (1ll<<(i))
#define FILE "tinhcldd"

void fastip(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    if (fopen(FILE".inp","r")){
        freopen(FILE".inp","r",stdin);
        freopen(FILE".out","w",stdout);
    }
}

const int MAX=500006;
const int div2=(MOD+1)/2;


struct Edge{
    int u,v,w;
    bool operator < (const Edge &o) const{
        return w<o.w;
    }
};


int n,m,q;
vector<Edge> E;
vector<int> Q;
int L[MAX], R[MAX], res[MAX];
int par[MAX];
int mx=0;
vector<int> W;

void init_dsu(){
    FOR(i,1,n) par[i]=i;
}

int f(int u){
    return u==par[u]?u:par[u]=f(par[u]);
}

void joint(int u, int v){
    u=f(u);
    v=f(v);
    if (u==v) return;

    if (u>v) swap(u,v);
    par[v]=u;

}

void solve(){
    cin>>n>>m>>q;
    FOR(i,1,m){
        int u,v,w;
        cin>>u>>v>>w;
        E.push_back({u,v,w});
        W.push_back(w);
    }

    sort(W.rbegin(),W.rend());
    W.erase(unique(W.begin(),W.end()),W.end());

    sort(E.rbegin(),E.rend());
    Q.push_back(0);
    FOR(i,1,q){
        int p;
        cin>>p;
        Q.push_back(p);
    }

    FOR(i,1,q) {
        L[i]=0, R[i]=W.size()-1, res[i]=-1;
    }

    while (1){
        vector<vector<int>> check(W.size()+1);
        init_dsu();
        int pro=0;
        FOR(i,1,q){
            if (L[i]<=R[i]){
                int mid=(L[i]+R[i])/2;
                check[mid].push_back(i);
                pro=1;
            }
        }
        if (!pro) break;

        int idE=0;
        for(int imid =0; imid<(int)W.size(); ++imid){
            int mid=W[imid];
            if (check[imid].empty()) continue;
            vector<int> idQ=check[imid];
            while (idE<m && mid<=E[idE].w){
                joint(E[idE].u,E[idE].v);
                idE++;
            }

            for(int id:idQ){
                if (f(Q[id])==1) {
                    res[id]=mid;
                    R[id]=imid-1;
                }
                else{
                    L[id]=imid+1;
                }
            }

        }

    }

    FOR(i,1,q) cout<<res[i]<<'\n';

}


int main(){


    fastip();

    solve();
}

Compilation message (stderr)

sightseeing.cpp: In function 'void fastip()':
sightseeing.cpp:23:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |         freopen(FILE".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
sightseeing.cpp:24:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |         freopen(FILE".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...