제출 #69867

#제출 시각아이디문제언어결과실행 시간메모리
69867KLPP낙하산 고리들 (IOI12_rings)C++14
20 / 100
2214 ms263168 KiB
#include<iostream> #include<vector> #include<queue> #include<stdio.h> using namespace std; class DSU{ int parent[1000000]; int size[1000000]; public: void init(int n){ for(int i=0;i<n;i++){ parent[i]=i; size[i]=1; } } int root(int a){ if(parent[a]==a)return a; parent[a]=root(parent[a]); return parent[a]; } void merge(int a, int b){ a=root(a); b=root(b); if(a==b)return; if(size[a]>size[b]){ size[a]+=size[b]; parent[b]=a; return; }size[b]+=size[a]; parent[a]=b; } bool samecomponent(int a, int b){ return root(a)==root(b); } }; class graph1{ int n; vector<int> nei[1000000]; int cyclesize; DSU *D; public: void init(int N){ n=N; cyclesize=-1; D=new DSU(); D->init(n); } int insert(int a, int b){ nei[a].push_back(b); nei[b].push_back(a); if(nei[a].size()==3){ return a; } if(nei[b].size()==3){ return b; } if(D->samecomponent(a,b)){ if(cyclesize!=-1)cyclesize=0; else{ queue<int> q; q.push(a); bool visited[n]; for(int i=0;i<n;i++)visited[i]=false; cyclesize=0; while(!q.empty()){ int u=q.front();q.pop(); if(!visited[u]){ visited[u]=true;cyclesize++; for(int i=0;i<nei[u].size();i++){ q.push(nei[u][i]); } } } } } D->merge(a,b); return -1; } int query(){ if(cyclesize==-1)return n; return cyclesize; } void print(){ for(int i=0;i<n;i++){ cout<<"Vizinhos de "<<i<<": "; for(int j=0;j<nei[i].size();j++)cout<<nei[i][j]<<" "; cout<<endl; } } int vizinho(int i, int j){ return nei[i][j]; } }; class graph2{ int n; vector<int> nei[1000000]; bool B; DSU *D; int proibido; public: void init(int N,int f){ n=N; B=true; D=new DSU(); D->init(n); proibido=f; } void insert(int a, int b){ if(a==proibido || b==proibido)return; nei[a].push_back(b); nei[b].push_back(a); if(nei[a].size()==3){ B=false; } if(nei[b].size()==3){B=false; } if(D->samecomponent(a,b)){ B=false; }D->merge(a,b); } bool query(){ return B; } }; int N; graph1 *G; vector<pair<int,int> >edges; int etapa; graph2 *arr[4]; void Init(int N_) { G=new graph1(); G->init(N_); etapa=1; N=N_; for(int i=0;i<4;i++)arr[i]=new graph2(); } void Link(int A, int B) { edges.push_back(pair<int,int>(A,B)); if(etapa==1){ int resposta=G->insert(A,B); if(resposta!=-1){ etapa=2; arr[3]->init(N,resposta); for(int i=0;i<3;i++){ arr[i]->init(N,G->vizinho(resposta,i)); } for(int i=0;i<edges.size();i++){ for(int j=0;j<4;j++){ arr[j]->insert(edges[i].first,edges[i].second); } } } }else{ for(int j=0;j<4;j++)arr[j]->insert(A,B); } } int CountCritical() {//G->print(); if(etapa==1){ return G->query(); } int ans=0; for(int i=0;i<4;i++)ans+=arr[i]->query(); return ans; }

컴파일 시 표준 에러 (stderr) 메시지

rings.cpp: In member function 'int graph1::insert(int, int)':
rings.cpp:71:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i=0;i<nei[u].size();i++){
                   ~^~~~~~~~~~~~~~
rings.cpp: In member function 'void graph1::print()':
rings.cpp:88:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j=0;j<nei[i].size();j++)cout<<nei[i][j]<<" ";
                ~^~~~~~~~~~~~~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:151:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int i=0;i<edges.size();i++){
                ~^~~~~~~~~~~~~
#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...