#include "hexagon.h"
#ifndef EVAL
#include "grader.cpp"
#endif
#include "bits/stdc++.h"
using namespace std;
#define ar array
const int mod = 1e9 + 7;
const int N = 2e3 + 5;
int is[N][N], used[N][N];
int bp(int a, int b){
int r = 1;
while(b){
if(b & 1) r = r * 1ll * a % mod;
b >>= 1, a = a * 1ll * a % mod;
} return r;
}
int draw_territory(int n, int A, int B, vector<int> d, vector<int> l) {
if(n == 3){
int L = l[0];
int res = (L + 1) * 1ll * (L + 2) / 2 % mod * A % mod;
res = (res + L * 1ll * (L + 1) % mod * (2 * L + 1) % mod * bp(6, mod - 2) % mod * B % mod) % mod;
res = (res + L * 1ll * (L + 1) / 2 % mod * B % mod) % mod;
return res;
}
//~ assert(false);
int ch[6][3] = {
{1, 1},
{1, 0},
{0, -1},
{-1, -1},
{-1, 0},
{0, 1}
};
ar<int, 2> c {};
vector<ar<int, 2>> p; p.push_back(c);
int _X = 0, _Y = 0;
for(int i=0;i<n;i++){ --d[i];
for(int k=0;k<l[i];k++){
for(int t=0;t<2;t++) c[t] += ch[d[i]][t];
p.push_back(c);
_X = min(_X, c[0]);
_Y = min(_Y, c[1]);
}
}
//~ cout<<_X<<" "<<_Y<<"\n";
_X = 1 - _X, _Y = 1 - _Y;
//~ cout<<"\n";
int last = 1;
for(auto& x : p){
//~ cout<<x[0]<<" "<<x[1]<<"\n";
x[0] = x[0] + _X;
x[1] = x[1] + _Y;
is[x[0]][x[1]] = last++;
}
//~ for(auto x : p){
//~ cout<<x[0]<<" "<<x[1]<<"\n";
//~ }
queue<int> q;
for(int i=0;i<N;i++){
used[0][i] = used[i][0] = used[N - 1][i] = used[i][N - 1] = 1;
q.push(i);
q.push(N * (N - 1) + i);
if(i || i + 1 < N){
q.push(i * N);
q.push(i * N + N - 1);
}
}
auto check = [&](int x, int y) { return (0 <= x && x < N && 0 <= y && y < N); };
while(!q.empty()){
int u = q.front(); q.pop();
int x = u / N, y = u % N;
for(int t=0;t<6;t++){
//~ if(ch[t][0] == ch[t][1]) continue;
int tx = x + ch[t][0], ty = y + ch[t][1];
if(check(tx, ty) && !is[tx][ty] && !used[tx][ty]){
used[tx][ty] = 1;
q.push(tx * N + ty);
}
}
}
//~ for(int i=0;i<15;i++){
//~ for(int j=0;j<15;j++){
//~ cout<<is[i][j]<<" ";
//~ } cout<<"\n";
//~ } cout<<"\n";
//~ _X = 1 - _X;
//~ _Y = 1 - _Y;
memset(is, 0, sizeof is);
q.push(_X * N + _Y);
is[_X][_Y] = 1;
while(!q.empty()){
int u = q.front(); q.pop();
int x = u / N, y = u % N;
for(int t=0;t<6;t++){
//~ if(ch[t][0] == ch[t][1]) continue;
int tx = x + ch[t][0], ty = y + ch[t][1];
if(check(tx, ty) && !is[tx][ty] && !used[tx][ty]){
is[tx][ty] = is[x][y] + 1;
q.push(tx * N + ty);
}
}
}
//~ for(int i=0;i<15;i++){
//~ for(int j=0;j<15;j++){
//~ cout<<is[i][j]<<" ";
//~ } cout<<"\n";
//~ } cout<<"\n";
int res = 0;
vector<int> D(15);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(!is[i][j]) continue;
is[i][j]--;
D[is[i][j]]++;
//~ cout<<is[i][j]<<" "<<i<<" "<<j<<"\n";
res = (res + is[i][j] * 1ll * B + A) % mod;
}
}
//~ for(int i=0;i<15;i++) cout<<i<<" "<<D[i]<<"\n";
//~ cout<<"\n";
return res;
}
/*
17 2 3
1 1
2 2
3 2
4 1
5 1
4 1
3 1
2 2
1 3
6 2
2 3
3 1
4 6
5 3
6 3
6 2
1 1
*/
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
1 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
212 KB |
Output is correct |
9 |
Correct |
1 ms |
212 KB |
Output is correct |
10 |
Correct |
1 ms |
212 KB |
Output is correct |
11 |
Correct |
0 ms |
212 KB |
Output is correct |
12 |
Correct |
1 ms |
212 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
135 ms |
31688 KB |
Output is correct |
2 |
Runtime error |
167 ms |
64352 KB |
Execution killed with signal 6 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
6 ms |
3652 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Runtime error |
5 ms |
3652 KB |
Execution killed with signal 11 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
126 ms |
31776 KB |
Output is correct |
2 |
Runtime error |
176 ms |
64228 KB |
Execution killed with signal 6 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
316 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Runtime error |
1435 ms |
1048576 KB |
Execution killed with signal 9 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
127 ms |
31680 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
0 ms |
212 KB |
Output is correct |
4 |
Correct |
0 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Runtime error |
156 ms |
64384 KB |
Execution killed with signal 6 |
7 |
Halted |
0 ms |
0 KB |
- |