This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define mp make_pair
#define pb push_back
#define a first
#define b second
#define endl '\n'
#include "towns.h"
int dist[201][201];
vector<pair<int,int>> adj[301];
int pa=-1;
int n;
vector<pair<int,int>> pp;
vector<pair<int,int>> pp2;
void dfs(int no,int par=-1){
if(no==pa){
pp2=pp;
}
for(auto j:adj[no]){
if(j.a!=par){
pp.pb({no,j.b});
dfs(j.a,no);
pp.pop_back();
}
}
}
int maa=0;
int kk=0;
int ss[301];
void dfs2(int no,int par=-1,int lev=0){
ss[no]=0;
if(adj[no].size()==1){
ss[no]++;
}
maa=max(maa,lev);
for(auto j:adj[no]){
if(j.a!=par){
dfs2(j.a,no,lev+j.b);
ss[no]+=ss[j.a];
if(ss[j.a]>(n/2)){
kk=-1;
}
}
}
//cout<<no<<"<"<<ss[no]<<endl;
}
int ans=1e9;
int st=-1;
//pair<int,int> ma={-1,-1};
int val[301];
/*void solve(int l,int r){
for(int i=0;i<2*n;i++){
adj[i].clear();
val[i]=0;
}
adj[l].pb({r,dist[l][r]});
adj[r].pb({l,dist[l][r]});
int ind2=n;
int qq=-1;
for(int i=0;i<n;i++){
int mi=-1;
if(l==i or r==i){
continue;
}
pair<int,int> cur={l,r};
int xx=(dist[cur.a][i]+dist[cur.b][i]-dist[cur.a][cur.b])/2;
pa=cur.b;
pp.clear();
pp2.clear();
dfs(cur.a);
int ind=0;
int su=0;
pp2.pb({pa,0});
while(ind+1<pp2.size()){
su+=pp2[ind].b;
ind++;
if(su>=dist[cur.a][i]-xx){
break;
}
}
//cout<<xx<<endl;
if(su==dist[cur.a][i]-xx){
ma=max(ma,{xx,i});
adj[pp2[ind].a].pb({i,xx});
val[pp2[ind].a]++;
if(val[pp2[ind].a]>(n/2)){
qq=pp2[ind].a;
}
adj[i].pb({pp2[ind].a,xx});
}
else{
pair<int,int> kk={pp2[ind-1].a,pp2[ind].a};
su-=pp2[ind-1].b;
int le=(dist[cur.a][i]-xx)-su;
vector<pair<int,int>> yy;
for(auto j:adj[kk.a]){
if(j.a!=kk.b){
yy.pb(j);
}
}
adj[kk.a]=yy;
yy.clear();
for(auto j:adj[kk.b]){
if(j.a!=kk.a){
yy.pb(j);
}
}
adj[kk.b]=yy;
adj[kk.a].pb({ind2,le});
adj[kk.b].pb({ind2,pp2[ind-1].b-le});
adj[ind2].pb({kk.a,le});
adj[ind2].pb({kk.b,pp2[ind-1].b-le});
adj[ind2].pb({i,xx});
adj[i].pb({ind2,xx});
ind2++;
}
}
for(int i=n;i<ind2;i++){
maa=0;
kk=1;
dfs2(i);
if(qq!=-1){
kk=-1;
}
//if(r>1){
if(maa<ans){
ans=maa;
st=kk;
}
else if(maa==ans){
st=max(st,kk);
}
//}
//ans=min(ans,ma);
}
}*/
pair<int,int> ma={-1,-1};
int vis[201];
bool get(int i,int j){
int yy;
if(dist[i][j]==0){
dist[i][j]=getDistance(i,j);
dist[j][i]=dist[i][j];
}
yy=dist[i][j];
int xx=dist[ma.b][i]+dist[0][i]-dist[0][ma.b];
xx/=2;
int xx2=dist[ma.b][j]+dist[0][j]-dist[0][ma.b];
xx2/=2;
if(xx+xx2==yy){
return false;
// bb.pb({aa[i],aa[i+1]});
}
else{
return true;
//cc.pb(aa[i]);
// cc.pb(aa[i+1]);
}
}
vector<int> solve(vector<int> aa){
mt19937 rng;
rng=mt19937(chrono::steady_clock::now().time_since_epoch().count());
shuffle(aa.begin(),aa.end(),rng);
/* for(auto j:aa){
cout<<j<<":";
}
cout<<endl;*/
if(aa.size()==1){
return aa;
}
/* for(auto j:aa){
cout<<j<<",";
}
cout<<endl;*/
/* vector<int> ee2;
vector<int> ee3;
int mid=aa.size()/2;
for(int i=0;i<mid;i++){
ee2.pb(aa[i]);
}
for(int i=mid;i<aa.size();i++){
ee3.pb(aa[i]);
}
vector<int> le=solve(ee2);
vector<int> re=solve(ee3);
if(le.size()==0 and re.size()==0){
return {};
}
for(int i=0;i<n;i++){
vis[i]=0;
}
for(auto j:le){
vis[j]=1;
}
for(auto j:re){
vis[j]=1;
}
if(le.size()>0 and re.size()>0){
if(get(le[0],re[0])){
for(auto j:re){
le.pb(j);
}
return le;
}
}
if(re.size()){
vector<int> kk;
for(auto j:re){
kk.pb(j);
}
for(auto j:ee2){
if(vis[j]==0){
if(get(j,re[0])){
kk.pb(j);
}
}
}
if(kk.size()>(aa.size())/2){
return kk;
}
}
swap(le,re);
if(re.size()){
vector<int> kk;
for(auto j:re){
kk.pb(j);
}
for(auto j:ee3){
if(vis[j]==0){
if(get(j,re[0])){
kk.pb(j);
}
}
}
if(kk.size()>(aa.size())/2){
return kk;
}
}
return {};
*/
/* vector<vector<int>> kk;
for(auto j:aa){
int ind2=-1;
int ind3=-1;
for(auto i:kk){
ind2++;
if(get(i.back(),j)){
ind3=ind2;
}
}
if(ind3==-1){
kk.pb({j});
}
else{
kk[ind3].pb(j);
}
}
for(auto j:kk){
if(j.size()>n/2){
return j;
}
}
return {};*/
if(aa.size()==1){
return aa;
}
vector<pair<int,int>> bb;
vector<int> cc;
for(int i=0;i+1<aa.size();i+=2){
if(get(aa[i],aa[i+1])){
bb.pb({aa[i],aa[i+1]});
}
else{
cc.pb(aa[i]);
cc.pb(aa[i+1]);
}
}
/*if(aa.size(_%2==1){
}*/
vector<int> dd;
for(auto j:bb){
dd.pb(j.a);
}
if(aa.size()%2==1){
vector<int> rr;
rr.pb(aa.back());
for(int i=0;i+1<aa.size();i+=2){
if(get(aa[i],aa[i+1])){
if(get(aa.back(),aa[i])){
//co++;
rr.pb(aa[i]);
}
}
else{
if(get(aa.back(),aa[i])){
//co++;
rr.pb(aa[i]);
}
if(get(aa.back(),aa[i+1])){
//co++;
rr.pb(aa[i+1]);
}
}
/* if(get(aa.back(),aa[i])){
//co++;
rr.pb(aa[i]);
}*/
}
if(2*rr.size()>aa.size()){
return rr;
}
}
if(dd.size()==0){
if(aa.size()%2==0){
return {};
}
else{
//int co=1;
vector<int> rr;
rr.pb(aa.back());
for(int i=0;i+1<aa.size();i+=1){
if(get(aa.back(),aa[i])){
//co++;
rr.pb(aa[i]);
}
}
/* for(auto j:rr){
cout<<j<<".";
}
cout<<endl;*/
if(2*rr.size()>aa.size()){
return rr;
}
return {};
}
}
if(aa.size()%2==1){
cc.pb(aa.back());
}
if(dd.size()==0){
return {};
}
vector<int> ee=solve(dd);
if(ee.size()==0){
/* for(auto j:rr){
cout<<j<<".";
}
cout<<endl;*/
return ee;
}
for(int i=0;i<n;i++){
vis[i]=0;
}
for(auto j:ee){
vis[j]=1;
}
for(auto j:ee){
}
for(auto j:bb){
if(vis[j.a]){
ee.pb(j.b);
}
}
for(auto j:cc){
if(get(ee[0],j)){
ee.pb(j);
}
}
if(ee.size()*2<=aa.size()){
return {};
}
return ee;
}
int hubDistance(int nn, int sub) {
n=nn;
ma={-1,-1};
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
dist[i][j]=0;
dist[j][i]=0;
if(i==0){
dist[i][j]=getDistance(i,j);
dist[j][i]=dist[i][j];
ma=max(ma,{dist[i][j],j});
}
}
}
pair<int,int> ma2={-1,-1};
for(int i=0;i<n;i++){
if(i!=0 and i!=ma.b){
dist[i][ma.b]=getDistance(i,ma.b);
dist[ma.b][i]=dist[i][ma.b];
ma2=max(ma2,{dist[i][ma.b],i});
}
}
for(int i=0;i<2*n;i++){
adj[i].clear();
}
adj[0].pb({ma.b,ma.a});
adj[ma.b].pb({0,ma.a});
int ind2=n;
int qq=-1;
for(int i=0;i<n;i++){
int mi=-1;
if(i==0 or i==ma.b){
continue;
}
pair<int,int> cur={0,ma.b};
/* for(int j=0;j<i;j++){
for(int k=j+1;k<i;k++){
int xx=dist[i][j]+dist[i][k]-dist[j][k];
if(mi==-1){
mi=xx;
cur={j,k};
}
if(xx<mi){
mi=xx;
cur={j,k};
}
}
}*/
int xx=(dist[cur.a][i]+dist[cur.b][i]-dist[cur.a][cur.b])/2;
pa=cur.b;
pp.clear();
pp2.clear();
dfs(cur.a);
int ind=0;
int su=0;
pp2.pb({pa,0});
//cout<<xx<<"<<"<<i<<endl;
while(ind+1<pp2.size()){
su+=pp2[ind].b;
ind++;
if(su>=dist[cur.a][i]-xx){
break;
}
}
//cout<<xx<<endl;
if(su==dist[cur.a][i]-xx){
ma=max(ma,{xx,i});
adj[pp2[ind].a].pb({i,xx});
/*val[pp2[ind].a]++;
if(val[pp2[ind].a]>(n/2)){
qq=pp2[ind].a;
}*/
adj[i].pb({pp2[ind].a,xx});
}
else{
pair<int,int> kk={pp2[ind-1].a,pp2[ind].a};
su-=pp2[ind-1].b;
int le=(dist[cur.a][i]-xx)-su;
vector<pair<int,int>> yy;
for(auto j:adj[kk.a]){
if(j.a!=kk.b){
yy.pb(j);
}
}
adj[kk.a]=yy;
yy.clear();
for(auto j:adj[kk.b]){
if(j.a!=kk.a){
yy.pb(j);
}
}
adj[kk.b]=yy;
adj[kk.a].pb({ind2,le});
adj[kk.b].pb({ind2,pp2[ind-1].b-le});
adj[ind2].pb({kk.a,le});
adj[ind2].pb({kk.b,pp2[ind-1].b-le});
adj[ind2].pb({i,xx});
adj[i].pb({ind2,xx});
ind2++;
}
}
ans=1e9;
st=-1;
int ind=-1;
/* cout<<0<<":"<<ma.b<<endl;
for(int i=n;i<ind2;i++){
cout<<i<<endl;
for(auto j:adj[i]){
cout<<j.a<<"."<<j.b<<" ";
}
cout<<endl;
}*/
for(int i=n;i<ind2;i++){
maa=0;
kk=1;
dfs2(i);
vector<int> ss;
for(auto j:adj[i]){
if(j.a!=0 and j.a!=ma.b and j.a<n){
ss.pb(j.a);
}
}
/*cout<<i<<":"<<maa<<":"<<kk<<endl;
for(auto j:ss){
cout<<j<<".";
}
cout<<endl;*/
if(ss.size()>(n/2) and sub>2){
vector<int> xx=solve(ss);
if(xx.size()>(n/2)){
kk=-1;
}
/*for(auto j:xx){
cout<<j<<",";
}
cout<<endl;*/
}
/*if(qq!=-1){
kk=-1;
}*/
/* if(qq!=i){
val[i]=0;
}*/
//if(r>1){
if(maa<ans){
ans=maa;
st=kk;
}
else if(maa==ans){
st=max(st,kk);
}
//}
//ans=min(ans,ma);
}
return ans*st;
//return R;
}
Compilation message (stderr)
towns.cpp: In function 'std::vector<int> solve(std::vector<int>)':
towns.cpp:295:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
295 | for(int i=0;i+1<aa.size();i+=2){
| ~~~^~~~~~~~~~
towns.cpp:317:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
317 | for(int i=0;i+1<aa.size();i+=2){
| ~~~^~~~~~~~~~
towns.cpp:352:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
352 | for(int i=0;i+1<aa.size();i+=1){
| ~~~^~~~~~~~~~
towns.cpp:392:11: warning: unused variable 'j' [-Wunused-variable]
392 | for(auto j:ee){
| ^
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:469:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
469 | while(ind+1<pp2.size()){
| ~~~~~^~~~~~~~~~~
towns.cpp:488:18: warning: declaration of 'kk' shadows a global declaration [-Wshadow]
488 | pair<int,int> kk={pp2[ind-1].a,pp2[ind].a};
| ^~
towns.cpp:32:5: note: shadowed declaration is here
32 | int kk=0;
| ^~
towns.cpp:442:7: warning: unused variable 'mi' [-Wunused-variable]
442 | int mi=-1;
| ^~
towns.cpp:530:15: warning: declaration of 'ss' shadows a global declaration [-Wshadow]
530 | vector<int> ss;
| ^~
towns.cpp:33:5: note: shadowed declaration is here
33 | int ss[301];
| ^~
towns.cpp:542:15: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
542 | if(ss.size()>(n/2) and sub>2){
| ~~~~~~~~~^~~~~~
towns.cpp:544:16: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
544 | if(xx.size()>(n/2)){
| ~~~~~~~~~^~~~~~
towns.cpp:439:6: warning: unused variable 'qq' [-Wunused-variable]
439 | int qq=-1;
| ^~
towns.cpp:517:6: warning: unused variable 'ind' [-Wunused-variable]
517 | int ind=-1;
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |