제출 #1021872

#제출 시각아이디문제언어결과실행 시간메모리
1021872nisanduuSplit the Attractions (IOI19_split)C++14
7 / 100
58 ms13436 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { ll A=a,B=b,C=c; vector<int> res(n); int m = p.size(); vector<vector<int>> adj(n+2); vector<int> calls(n+2); for(int i=0;i<m;i++){ adj[p[i]].push_back(q[i]); adj[q[i]].push_back(p[i]); calls[p[i]]++; calls[q[i]]++; } vector<int> vis(n+2); bool f=1; for(auto el:adj){ if(el.size()>2){ f=0; break; } } if(f){ int st = 0; for(int i=0;i<n;i++){ if(calls[i]==1){ st=i; break; } } queue<int> pq; pq.push(st); while(!pq.empty()){ int node = pq.front(); pq.pop(); vis[node]=1; if(a>0){ res[node]=1; a--; }else if(b>0){ b--; res[node]=2; }else{ c--; res[node]=3; } for(auto el:adj[node]){ if(!vis[el]){ pq.push(el); } } } } else{ bool f1=0; if(B>C){ swap(B,C); f1=1; } stack<int> ds; ds.push(0); vector<int> vis1(n+10); while(!ds.empty()){ int node = ds.top(); vis1[node]=1; ds.pop(); if(B>0){ res[node]=f1 ? 3 : 2; B--; }else if(A>0){ A--; res[node]=1; }else{ res[node]=f1 ? 2 : 3; } for(auto el:adj[node]){ if(!vis1[el]){ ds.push(el); } } } } return res; }
#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...