Submission #382850

#TimeUsernameProblemLanguageResultExecution timeMemory
382850mehrdad_sohrabiIdeal city (IOI12_city)C++14
100 / 100
865 ms26004 KiB
#include <bits/stdc++.h> /// 500 485 462 A4 using namespace std; typedef long long int ll; typedef complex<double> point; typedef long double ld; #define pb push_back #define pii pair < ll , ll > #define F first #define S second //#define endl '\n' //#define int long long #define sync ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") #define kill(x) return cout<<x<<'\n', 0; #define inbuf_len 1 << 16 #define outbuf_len 1 << 16 const int MAXN=2e5+100; map <pii,int> mp; map <pii,int> vis; vector <int> g[MAXN]; ll sz[MAXN]; ll dis[MAXN]; void dfs(ll v){ sz[v]=1; for (auto u : g[v]){ dfs(u); sz[v]+=sz[u]; } } void bfs(ll X,ll Y){ memset(dis,63,sizeof dis); dis[mp[{X,Y}]]=0; queue <pii> q; q.push({X,Y}); dis[0]=0; while(q.size()){ ll x=q.front().F,y=q.front().S; q.pop(); if (dis[mp[{x-1,y}]]>dis[mp[{x,y}]]+1){ g[mp[{x,y}]].pb(mp[{x-1,y}]); dis[mp[{x-1,y}]]=dis[mp[{x,y}]]+1; q.push({x-1,y}); } if (dis[mp[{x+1,y}]]>dis[mp[{x,y}]]+1){ g[mp[{x,y}]].pb(mp[{x+1,y}]); dis[mp[{x+1,y}]]=dis[mp[{x,y}]]+1; q.push({x+1,y}); } if (dis[mp[{x,y-1}]]>dis[mp[{x,y}]]+1){ g[mp[{x,y}]].pb(mp[{x,y-1}]); dis[mp[{x,y-1}]]=dis[mp[{x,y}]]+1; q.push({x,y-1}); } if (dis[mp[{x,y+1}]]>dis[mp[{x,y}]]+1){ g[mp[{x,y}]].pb(mp[{x,y+1}]); dis[mp[{x,y+1}]]=dis[mp[{x,y}]]+1; q.push({x,y+1}); } } dfs(mp[{X,Y}]); } ll hal(int N,int *X,int *Y){ ll ans=0; for (int i=0;i<MAXN;i++) g[i].clear(); mp.clear(); vector <pii> a; for (int i=0;i<N;i++){ a.pb({X[i],Y[i]}); } sort(a.begin(),a.end()); for (int i=0;i<a.size();i++){ mp[a[i]]=i+1; } bfs(a.back().F,a.back().S); dis[0]=1e9; for (int i=0;i<a.size();i++){ ll j=i; while(j<a.size() && a[j].F==a[i].F && a[j].S-a[i].S==j-i) j++; // for (int k=i;k<j;k++){ // cout << a[k].F << " " << a[k].S << " " ; // } // cout << endl; vector <ll> b; vector <ll> w; ll last=-1; ll p1=0; ll ss=0,zz=0; for (int k=i;k<j;k++){ ll z=k; if (dis[mp[{a[k].F-1,a[k].S}]]<dis[mp[a[k]]]) p1=1; if (mp[{a[k].F-1,a[k].S}]==0 || dis[mp[{a[k].F-1,a[k].S}]]<dis[mp[a[k]]]) continue; ll mx=0; while(z<j && !(mp[{a[z].F-1,a[z].S}]==0 || dis[mp[{a[z].F-1,a[z].S}]]<dis[mp[a[z]]])){ mx=max(mx,sz[mp[{a[z].F-1,a[z].S}]]); z++; } b.pb(mx); ss+=mx; k=z-1; } for (int k=i;k<j;k++){ ll z=k; if (dis[mp[{a[k].F+1,a[k].S}]]<dis[mp[a[k]]]) p1=2; if (mp[{a[k].F+1,a[k].S}]==0 || dis[mp[{a[k].F+1,a[k].S}]]<dis[mp[a[k]]]) continue; ll mx=0; while(z<j && !(mp[{a[z].F+1,a[z].S}]==0 || dis[mp[{a[z].F+1,a[z].S}]]<dis[mp[a[z]]])){ mx=max(mx,sz[mp[{a[z].F+1,a[z].S}]]); z++; } w.pb(mx); zz+=mx; k=z-1; } // cout << p1 << " p1" << endl; ll h=N-ss-zz; if (p1==1){ b.pb(h-(j-i)); ss+=h-(j-i); w.clear(); zz+=j-i; w.pb(zz); } else{ w.clear(); zz+=h; w.pb(zz); } ans+=ss*zz+ss*ss+zz*zz; for (auto u : b) ans-=u*u; for (auto u : w) ans-=u*u; i=j-1; } return ans; } int DistanceSum(int N, int *X, int *Y) { ll ans=hal(N,X,Y); ans+=hal(N,Y,X); return ans%(ll)(1e9); } /* int main() { int tmp; char *inbuf, *outbuf; inbuf = (char*) malloc(inbuf_len * sizeof(char)); outbuf = (char*) malloc(outbuf_len * sizeof(char)); tmp = setvbuf(stdin, inbuf, _IOFBF, inbuf_len); assert(tmp == 0); tmp = setvbuf(stdout, outbuf, _IOFBF, outbuf_len); assert(tmp == 0); int N, i; tmp = scanf("%d", &N); assert(tmp == 1); int *sq_x, *sq_y; sq_x = (int*) malloc(N * sizeof(int)); sq_y = (int*) malloc(N * sizeof(int)); for (i = 0; i < N; i++) { tmp = scanf("%d %d", &sq_x[i], &sq_y[i]); assert(tmp == 2); } int ds = DistanceSum(N, sq_x, sq_y); printf("%d\n", ds); return 0; } 20 3 5 4 6 2 5 3 4 6 5 1 6 2 7 3 1 2 6 1 5 5 5 5 4 4 7 4 2 3 2 3 3 4 4 4 3 4 5 5 2 */

Compilation message (stderr)

city.cpp: In function 'll hal(int, int*, int*)':
city.cpp:73:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |     for (int i=0;i<a.size();i++){
      |                  ~^~~~~~~~~
city.cpp:78:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |     for (int i=0;i<a.size();i++){
      |                  ~^~~~~~~~~
city.cpp:80:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |         while(j<a.size() && a[j].F==a[i].F && a[j].S-a[i].S==j-i) j++;
      |               ~^~~~~~~~~
city.cpp:87:12: warning: unused variable 'last' [-Wunused-variable]
   87 |         ll last=-1;
      |            ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...