Submission #533696

#TimeUsernameProblemLanguageResultExecution timeMemory
533696DanerZeinHexagonal Territory (APIO21_hexagon)C++14
11 / 100
1560 ms1048576 KiB
#include "hexagon.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
const ll mod=1e9+7;
const int MAX_N=8e3;
int X[8]={0,-2,-1,1,2,1,-1};
int Y[8]={0,0,1,1,0,-1,-1};
ll he[MAX_N+10][MAX_N+10];
int vis[MAX_N+10][MAX_N+10];
ll pot(ll b,ll e){
  if(e==1) return b;
  ll aux=pot(b,e/2);
  aux*=aux; aux%=mod;
  if(e%2!=0) aux=(aux*b)%mod;
  return aux;
}
void flod(int x,int y){
  vis[x][y]=2;
  queue<ii> q;
  q.push(ii(x,y));
  while(!q.empty()){
    int x=q.front().first;
    int y=q.front().second;
    q.pop(); 
    for(int i=1;i<=6;i++){
      int xk=x+X[i];
      int yk=y+Y[i];
      if(xk>=0 && yk>=0 && xk<=MAX_N && yk<=MAX_N && !vis[xk][yk]){
	vis[xk][yk]=2;
	q.push(ii(xk,yk));
      }
    }
  }
}
void height(int x,int y){
  for(int i=0;i<=MAX_N;i++) for(int j=0;j<=MAX_N;j++) he[i][j]=1e9;
  he[x][y]=0;
  queue<ii> q;
  q.push(ii(x,y));
  while(!q.empty()){
    int xi=q.front().first;
    int yi=q.front().second;
    q.pop();
    for(int i=1;i<=6;i++){
      int xk=xi+X[i];
      int yk=yi+Y[i];
      if(xk>=0 && yk>=0 && xk<=MAX_N && yk<=MAX_N && vis[xk][yk]<=1){
	if(he[xk][yk]>he[xi][yi]+1){
	  he[xk][yk]=he[xi][yi]+1;
	  q.push(ii(xk,yk));
	}
      }
    }
  }
}
int draw_territory(int N, int A, int B,
                   std::vector<int> D, std::vector<int> L) {
  memset(he,-1,sizeof he);
  memset(vis,0,sizeof vis);
  ll ans=0;
  int x=4e3,y=4e3;
  vis[x][y]=1;
  for(int i=0;i<N;i++){
    for(int j=0;j<L[i];j++){
      x+=X[D[i]];
      y+=Y[D[i]];
      vis[x][y]=1;
    }
  }
  for(int i=1;i<=6;i++){
    x=4e3; y=4e3;
    while(x>=0 && y>=0 && x<=MAX_N && y<=MAX_N){
      x+=X[i];
      y+=Y[i];
    }
    x-=X[i];
    y-=Y[i];
    if(!vis[x][y]){
      flod(x,y);
      break;
    }
  }
  x=4e3; y=4e3;
  height(x,y);
  for(int i=0;i<=MAX_N;i++){
    for(int j=0;j<=MAX_N;j++){
      if(he[i][j]!=1e9){
	ans+=A; ans%=mod;
	ans+=B*he[i][j]; ans%=mod;
      }
    }
  }
  return ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...