제출 #605732

#제출 시각아이디문제언어결과실행 시간메모리
605732rrrr10000Split the Attractions (IOI19_split)C++14
0 / 100
146 ms37700 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> vi; typedef vector<vi> vvi; typedef vector<vvi> vvvi; typedef pair<ll,ll> P; typedef vector<P> vp; typedef vector<vp> vvp; typedef vector<vvp> vvvp; // typedef vector<bool> vb; #define rep(i,n) for(ll i=0;i<(ll)(n);i++) #define REP(i,k,n) for(ll i=(ll)(k);i<(ll)(n);i++) #define all(a) a.begin(),a.end() #define rsort(a) {sort(all(a));reverse(all(a));} #define fi first #define se second #define pb emplace_back template<class T> void out(T a){cout<<a<<endl;} template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];}cout<<endl;} template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;} const ll inf=1001001001; struct UF{ vi par,sz; UF(ll n):par(n,-1),sz(n,1){} bool merge(ll a,ll b){ a=root(a);b=root(b); if(a==b)return false; if(sz[a]<sz[b])swap(a,b); sz[a]+=sz[b];par[b]=a; } ll root(ll i){ if(par[i]==-1)return i; return root(par[i]); } }; vector<int> find_split(int n, int A, int B, int C, vector<int> p, vector<int> q) { ll k=min({A,B,C}); vector<int> res(n); vvp g1(n); ll m=p.size(); rep(i,m){ g1[p[i]].pb(q[i],i); g1[q[i]].pb(p[i],i); } vi lk(n,inf),dep(n,-1),par(n); vector<bool> bridge(m,false); UF uf(n); function<void(ll,ll,ll)> dfs=[&](ll i,ll p,ll d){ par[i]=p;dep[i]=d; for(auto x:g1[i])if(x.fi!=p){ if(dep[x.fi]==-1){ dfs(x.fi,i,d+1); chmin(lk[i],lk[x.fi]); if(lk[x.fi]>dep[i])bridge[x.se]=true; else uf.merge(i,x.fi); } else{ chmin(lk[i],dep[x.fi]); } } };dfs(0,-1,0); vvp g2(n); rep(i,m)if(bridge[i]){ ll a=uf.root(p[i]),b=uf.root(q[i]); g2[a].pb(b,q[i]);g2[b].pb(a,p[i]); } queue<ll> que; vi deg(n); rep(i,n)deg[i]=g2[i].size(); vvi gr1(n);rep(i,n)gr1[uf.root(i)].pb(i); rep(i,n)if(gr1[i].size()>0&&gr1[i].size()<k&&deg[i]==1)que.push(i); while(!que.empty()){ ll t=que.front();que.pop(); for(auto x:g2[t])if(gr1[x.fi].size()>0){ if(gr1[x.fi].size()<gr1[t].size())swap(gr1[x.fi],gr1[t]); for(ll y:gr1[t])gr1[x.fi].pb(y); gr1[t].clear(); deg[x.fi]--; if(deg[x.fi]==1&&gr1[x.fi].size()<k)que.push(x.fi); } } vi al; rep(i,n)if(gr1[i].size()>0)al.pb(i); if(al.size()>1){ ll t=0; while(deg[al[t]]!=1)t++; t=al[t]; vi va,vb,vc; for(ll x:gr1[t])va.pb(x); vector<bool> used(n,false); for(ll x:va)used[x]=true; rep(i,n)if(!used[i])vb.pb(i); if(va.size()>vb.size())swap(va,vb); while(va.size()>k){ vc.pb(va.back());va.pop_back(); } while(vb.size()>n-max({A,B,C})-k){ vc.pb(vb.back());vb.pop_back(); } // outv(va);outv(vb);outv(vc); if(A!=va.size())swap(va,vb); if(A!=va.size())swap(va,vc); if(B!=vb.size())swap(vb,vc); for(ll x:va)res[x]=1; for(ll x:vb)res[x]=2; for(ll x:vc)res[x]=3; return res; } return res; }

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

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:74:43: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   74 |  rep(i,n)if(gr1[i].size()>0&&gr1[i].size()<k&&deg[i]==1)que.push(i);
      |                              ~~~~~~~~~~~~~^~
split.cpp:82:37: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   82 |    if(deg[x.fi]==1&&gr1[x.fi].size()<k)que.push(x.fi);
      |                     ~~~~~~~~~~~~~~~~^~
split.cpp:97:18: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   97 |   while(va.size()>k){
      |         ~~~~~~~~~^~
split.cpp:100:18: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
  100 |   while(vb.size()>n-max({A,B,C})-k){
      |         ~~~~~~~~~^~~~~~~~~~~~~~~~~
split.cpp:104:7: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |   if(A!=va.size())swap(va,vb);
      |      ~^~~~~~~~~~~
split.cpp:105:7: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |   if(A!=va.size())swap(va,vc);
      |      ~^~~~~~~~~~~
split.cpp:106:7: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |   if(B!=vb.size())swap(vb,vc);
      |      ~^~~~~~~~~~~
split.cpp: In member function 'bool UF::merge(ll, ll)':
split.cpp:32:22: warning: control reaches end of non-void function [-Wreturn-type]
   32 |   sz[a]+=sz[b];par[b]=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...