제출 #392071

#제출 시각아이디문제언어결과실행 시간메모리
392071loctildoreIdeal city (IOI12_city)C++14
0 / 100
17 ms3020 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define x first
#define y second
#define elif else if
#define endl '\n'
#define all(x) begin(x), end(x)
#define MOD 1000000000
template <typename T>
ostream& operator << (ostream& os, const vector<T>& a) {
    os << '[';
    bool E = false;
    for(const T& x : a) {
        if(E) os << ' ';
        os << x;
        E = true;
    }
    return os << ']';
}
int n,*x,*y;
ll total;
unordered_map<ll,int> mp;
int done[100069][2];
ll convert(pair<int,int> p){
  return ((ll)p.f<<31)+p.s;
}
int dfs(int node,int orientation){
  if (done[node][orientation]) return 0;
  done[node][orientation]=true;
  int temp,cnt=0;
  if (orientation) {
    if (mp.find(convert({x[node]+1,y[node]}))!=mp.end()) {
      cnt+=dfs(mp[convert({x[node]+1,y[node]})],orientation);
    }
    if (mp.find(convert({x[node]-1,y[node]}))!=mp.end()) {
      cnt+=dfs(mp[convert({x[node]-1,y[node]})],orientation);
    }
    if (mp.find(convert({x[node],y[node]+1}))!=mp.end()) {
      temp=dfs(mp[convert({x[node],y[node]+1})],orientation);
      total+=(ll)temp*(n-temp);
      cnt+=temp;
    }
    if (mp.find(convert({x[node],y[node]-1}))!=mp.end()) {
      temp=dfs(mp[convert({x[node],y[node]-1})],orientation);
      total+=(ll)temp*(n-temp);
      cnt+=temp;
    }
  }
  else{
    if (mp.find(convert({x[node],y[node]+1}))!=mp.end()) {
      cnt+=dfs(mp[convert({x[node],y[node]+1})],orientation);
    }
    if (mp.find(convert({x[node],y[node]-1}))!=mp.end()) {
      cnt+=dfs(mp[convert({x[node],y[node]-1})],orientation);
    }
    if (mp.find(convert({x[node]+1,y[node]}))!=mp.end()) {
      temp=dfs(mp[convert({x[node]+1,y[node]})],orientation);
      total+=(ll)temp*(n-temp);
      cnt+=temp;
    }
    if (mp.find(convert({x[node]-1,y[node]}))!=mp.end()) {
      temp=dfs(mp[convert({x[node]-1,y[node]})],orientation);
      total+=(ll)temp*(n-temp);
      cnt+=temp;
    }
  }
  return cnt+1;
}
int DistanceSum(int N, int *X, int *Y) {
  n=N;x=X;y=Y;
  for (int i = 0; i < n; i++) {
    mp[((ll)x[i]<<31)+y[i]]=i;
  }
  dfs(0,0);dfs(0,1);
  return total%MOD;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...