Submission #425466

#TimeUsernameProblemLanguageResultExecution timeMemory
425466errorgornRigged Roads (NOI19_riggedroads)C++17
100 / 100
407 ms42088 KiB
#include <cstdio>
#include <vector>
#include <utility>
#include <tuple>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int> ii;
int n,e,k;
vector<int> al[300005],temp;
vector<ii> edge;
int depth[300005],w[300005],p[300005],in[300005],father[300005];
bool tree[300005];
int parent(int i){return (p[i]==i)?i:p[i]=parent(p[i]);}
void unions(int i,int j){ //asssume i is lower than j
    i=parent(i);
    j=parent(j);
    p[i]=j;
}
void dfs(int i){
    for (vector<int>::iterator it=al[i].begin();it!=al[i].end();it++){
        if (depth[*it]==-1){
            depth[*it]=depth[i]+1;
            dfs(*it);
        }
    }
}
int main(){
    //freopen("input.txt","r",stdin);
    int a,b;
    edge.push_back(ii(0,0));
    for (int x=0;x<300005;x++){
        p[x]=x;
    }
    scanf("%d%d",&n,&e);
    for (int x=1;x<=e;x++){
        scanf("%d%d",&a,&b);
        edge.push_back(ii(a,b));
    }
    for (int x=1;x<n;x++){
        scanf("%d",&a);
        tree[a]=true;
        tie(a,b)=edge[a];
        al[a].push_back(b);
        al[b].push_back(a);
    }
    memset(depth,-1,sizeof(depth));
    depth[1]=0;
    dfs(1);
    for (int x=1;x<=e;x++){
        if (tree[x]){
            a=edge[x].first,b=edge[x].second;
            if (depth[a]<depth[b]) swap(a,b);
            in[a]=x;
            father[a]=b;
        }
    }
    for (int x=1;x<=e;x++){
        if (w[x]==0){
            a=edge[x].first,b=edge[x].second;
            a=parent(a);
            b=parent(b);
            if (!tree[x]){
                temp.clear();
                while (a!=b){
                    if (depth[a]<depth[b]) swap(a,b);
                    temp.push_back(in[a]);
                    unions(a,father[a]);
                    a=parent(a);
                }
                sort(temp.begin(),temp.end());
                for (vector<int>::iterator it=temp.begin();it!=temp.end();it++){
                    w[*it]=++k;
                }
            }
            else{
                if (a!=b){
                    if (depth[a]<depth[b]) swap(a,b);
                    unions(a,b);
                }
            }
            w[x]=++k;
        }
        printf("%d ",w[x]);
    }
}

Compilation message (stderr)

riggedroads.cpp: In function 'int main()':
riggedroads.cpp:35:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |     scanf("%d%d",&n,&e);
      |     ~~~~~^~~~~~~~~~~~~~
riggedroads.cpp:37:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |         scanf("%d%d",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~
riggedroads.cpp:41:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   41 |         scanf("%d",&a);
      |         ~~~~~^~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...