Submission #133679

#TimeUsernameProblemLanguageResultExecution timeMemory
133679ckodserTowns (IOI15_towns)C++14
35 / 100
23 ms632 KiB
#include "towns.h" #include<bits/stdc++.h> #define ll long long #define pb push_back #define ld long double #define mp make_pair #define F first #define S second #define pii pair<ll,ll> using namespace :: std; const ll maxn=700; const ll inf=1e9+900; ll fasta0[maxn]; ll sub,gn; vector<pii> ger[maxn]; void addYal(ll a,ll b,ll w){ ger[a].pb(mp(b,w)); ger[b].pb(mp(a,w)); } ll findFar(ll a,ll p=-1){ ll ans=0; for(auto e:ger[a]){ if(e.F!=p){ ans=max(ans,findFar(e.F,a)+e.S); } } return ans; } ll findSubTree(ll a,ll p=-1){ ll ans=(a<gn); for(auto e:ger[a]){ if(e.F!=p){ ans+=findSubTree(e.F,a); } } return ans; } bool isBAD(ll v){ for(auto e:ger[v]){ ll sz=findSubTree(e.F,v); if(sz>gn/2){ return 1; } } return 0; } pair<vector<ll> ,ll> shoa(ll n){ ll ans=inf; vector<ll> vec; for(ll i=0;i<n;i++){ ll r=findFar(i); if(r<ans){ vec.clear(); ans=r; } if(r==ans){ vec.pb(i); } } return mp(vec,ans); } int hubDistance(int n, int Sub) { gn=n; sub=Sub; memset(fasta0,0,sizeof fasta0); for(ll i=0;i<maxn;i++){ ger[i].clear(); } pii far=mp(0,0); for(ll i=1;i<n;i++){ fasta0[i]=getDistance(0,i); far=max(far,mp(fasta0[i],i)); } ll v=far.S; ll u=0; ll w=far.F; vector<pair<ll,pii> > vec; vector<ll> comp; for(ll i=1;i<n;i++){ if(i!=v && i!=u){ ll a=getDistance(v,i); ll b=getDistance(u,i); ll s123=(a+b+w)/2; ll s1=s123-a; ll s2=s123-b; ll s3=s123-w; vec.pb(mp(i,mp(s1,s3))); comp.pb(s1); } } sort(comp.begin(),comp.end()); comp.resize(unique(comp.begin(),comp.end())-comp.begin()); addYal(u,n,comp[0]); for(ll i=0;i+1<comp.size();i++){ addYal(n+i,n+i+1,comp[i+1]-comp[i]); } addYal(n+comp.size()-1,v,w-comp.back()); for(auto e:vec){ ll u=lower_bound(comp.begin(),comp.end(),e.S.F)-comp.begin(); addYal(e.F,n+u,e.S.S); } pair<vector<ll> ,ll> eee=shoa(n+comp.size()); ll r=eee.S; if(sub<=2){ return r; } vector<ll> ves; for(auto v:eee.F){ if(!isBAD(v)){ ves.pb(v); } } if(ves.size()==0){ return -r; } if(ves.size()>1){ return r; } ll cent=ves[0]; vector<pii> ham; for(auto e:ger[cent]){ if(e.F<n){ ham.pb(e); } } if(ham.size()<=gn/2){ return r; } if(sub==4)return -r; while(ham.size()){ pii ey=ham[rand()%ham.size()]; ll v=ey.F; bitset<400> bi; bi=0; ll sum=0; bi[v]=1; for(auto e:ham){ ll u=e.F; if(v!=u){ ll r=getDistance(v,u); if(r!=e.S+ey.S){ bi[u]=1; sum++; } } } if(sum>gn/2){ return -r; } vector<pii> newham; for(auto e:ham){ if(!bi[e.F]){ newham.pb(e); } } ham=newham; } return -r; }

Compilation message (stderr)

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:80:27: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  fasta0[i]=getDistance(0,i);
                           ^
towns.cpp:90:26: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
      ll a=getDistance(v,i);
                          ^
towns.cpp:90:26: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
towns.cpp:91:26: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
      ll b=getDistance(u,i);
                          ^
towns.cpp:91:26: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
towns.cpp:94:9: warning: unused variable 's2' [-Wunused-variable]
      ll s2=s123-b;
         ^~
towns.cpp:103:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(ll i=0;i+1<comp.size();i++){
                ~~~^~~~~~~~~~~~
towns.cpp:108:5: warning: declaration of 'u' shadows a previous local [-Wshadow]
  ll u=lower_bound(comp.begin(),comp.end(),e.S.F)-comp.begin();
     ^
towns.cpp:84:8: note: shadowed declaration is here
     ll u=0;
        ^
towns.cpp:114:9: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return r;
         ^
towns.cpp:117:14: warning: declaration of 'v' shadows a previous local [-Wshadow]
     for(auto v:eee.F){
              ^
towns.cpp:83:8: note: shadowed declaration is here
     ll v=far.S;
        ^
towns.cpp:123:9: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return -r;
         ^~
towns.cpp:126:9: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return r;
         ^
towns.cpp:135:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(ham.size()<=gn/2){
        ~~~~~~~~~~^~~~~~
towns.cpp:136:9: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return r;
         ^
towns.cpp:138:22: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
     if(sub==4)return -r;
                      ^~
towns.cpp:141:5: warning: declaration of 'v' shadows a previous local [-Wshadow]
  ll v=ey.F;
     ^
towns.cpp:83:8: note: shadowed declaration is here
     ll v=far.S;
        ^
towns.cpp:147:9: warning: declaration of 'u' shadows a previous local [-Wshadow]
      ll u=e.F;
         ^
towns.cpp:84:8: note: shadowed declaration is here
     ll u=0;
        ^
towns.cpp:149:6: warning: declaration of 'r' shadows a previous local [-Wshadow]
   ll r=getDistance(v,u);
      ^
towns.cpp:112:8: note: shadowed declaration is here
     ll r=eee.S;
        ^
towns.cpp:149:23: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
   ll r=getDistance(v,u);
                       ^
towns.cpp:149:23: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
towns.cpp:157:13: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
      return -r;
             ^~
towns.cpp:167:12: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
     return -r;
            ^~
#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...