Submission #1153335

#TimeUsernameProblemLanguageResultExecution timeMemory
1153335omtheprogrammer1Soccer (JOI17_soccer)C++20
0 / 100
22 ms49220 KiB
#include <bits/stdc++.h>

using namespace std;

#define endl "\n"
#define ms(arr, v) memset(arr, v, sizeof(arr))
#define mp make_pair
#define pb push_back
#define fix(prec) {cout << setprecision(prec) << fixed;}
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);
#define ins insert
#define f first
#define s second
#define all(v) v.begin(), v.end()
#define sz(v) (ll)v.size()
#define readgraph(list, edges) for (ll i = 0; i < edges; i++) {ll a, b; cin >> a >> b; a--; b--; list[a].pb(b); list[b].pb(a);}
typedef long long ll;
typedef unsigned long long ull;
typedef long double lld;
typedef vector<ll> vi;
typedef pair<ll, ll> pii;
#define F_OR(i, a, b, s) for (ll i=(a); (s)>0?i<(b):i>(b); i+=(s))
#define F_OR1(e) F_OR(i, 0, e, 1)
#define F_OR2(i, e) F_OR(i, 0, e, 1)
#define F_OR3(i, b, e) F_OR(i, b, e, 1)
#define F_OR4(i, b, e, s) F_OR(i, b, e, s)
#define GET5(a, b, c, d, e, ...) e
#define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1)
#define FOR(...) F_ORC(__VA_ARGS__)(__VA_ARGS__)
#define EACH(x, a) for (auto& x: a)

ll prexor(ll i) {
  i++;
  if ((i % 4) == 0) return 0;
  else if ((i % 4) == 1) return i - 1;
  else if ((i % 4) == 2) return 1;
  else return i;
}
ll rangexor(ll l, ll r) {
  if (l == 0) return prexor(r);
  return prexor(r)^prexor(l - 1);
}
ll FIRSTTRUE(function<bool(ll)> f, ll lb, ll rb) {
  while (lb < rb) {
    ll mb = (lb + rb) / 2;
    f(mb) ? rb = mb : lb = mb + 1;
  }
  return lb;
}
ll LASTTRUE(function<bool(ll)> f, ll lb, ll rb) {
  while (lb < rb) {
    ll mb = (lb + rb + 1) / 2;
    f(mb) ? lb = mb : rb = mb - 1;
  }
  return lb;
}

template<class A> void read(vector<A>& v);
template<class A, size_t S> void read(array<A, S>& a);
template<class T> void read(T& x) {
  cin >> x;
}
void read(double& d) {
  string t;
  read(t);
  d = stod(t);
}
void read(long double& d) {
  string t;
  read(t);
  d = stold(t);
}
template<class H, class... T> void read(H& h, T&... t) {
  read(h);
  read(t...);
}
template<class A> void read(vector<A>& x) {
  EACH(a, x)
  read(a);
}
template<class A, size_t S> void read(array<A, S>& x) {
  EACH(a, x)
  read(a);
}

// #define cerr cout
namespace __DEBUG_UTIL__
{
/* Primitive Datatypes Print */
void print(const char *x) { cerr << x; }
void print(bool x) { cerr << (x ? "T" : "F"); }
void print(char x) { cerr << '\'' << x << '\''; }
void print(signed short int x) { cerr << x; }
void print(unsigned short int x) { cerr << x; }
void print(signed int x) { cerr << x; }
void print(unsigned int x) { cerr << x; }
void print(signed long int x) { cerr << x; }
void print(unsigned long int x) { cerr << x; }
void print(signed long long int x) { cerr << x; }
void print(unsigned long long int x) { cerr << x; }
void print(float x) { cerr << x; }
void print(double x) { cerr << x; }
void print(long double x) { cerr << x; }
void print(string x) { cerr << '\"' << x << '\"'; }
template <size_t N>
void print(bitset<N> x) { cerr << x; }
void print(vector<bool> v)
{ /* Overloaded this because stl optimizes vector<bool> by using
      _Bit_reference instead of bool to conserve space. */
  int f = 0;
  cerr << '{';
  for (auto && i : v)
    cerr << (f++ ? "," : "") << (i ? "T" : "F");
  cerr << "}";
}
/* Templates Declarations to support nested datatypes */
template <typename T>
void print(T &&x);
template <typename T>
void print(vector<vector<T>> mat);
template <typename T, size_t N, size_t M>
void print(T (&mat)[N][M]);
template <typename F, typename S>
void print(pair<F, S> x);
template <typename T, size_t N>
struct Tuple;
template <typename T>
struct Tuple<T, 1>;
template <typename... Args>
void print(tuple<Args...> t);
template <typename... T>
void print(priority_queue<T...> pq);
template <typename T>
void print(stack<T> st);
template <typename T>
void print(queue<T> q);
/* Template Datatypes Definitions */
template <typename T>
void print(T &&x)
{
  /*  This works for every container that supports range-based loop
      i.e. vector, set, map, oset, omap, dequeue */
  int f = 0;
  cerr << '{';
  for (auto && i : x)
    cerr << (f++ ? "," : ""), print(i);
  cerr << "}";
}
template <typename T>
void print(vector<vector<T>> mat)
{
  int f = 0;
  cerr << "\n~~~~~\n";
  for (auto && i : mat)
  {
    cerr << setw(2) << left << f++, print(i), cerr << "\n";
  }
  cerr << "~~~~~\n";
}
template <typename T, size_t N, size_t M>
void print(T (&mat)[N][M])
{
  int f = 0;
  cerr << "\n~~~~~\n";
  for (auto && i : mat)
  {
    cerr << setw(2) << left << f++, print(i), cerr << "\n";
  }
  cerr << "~~~~~\n";
}
template <typename F, typename S>
void print(pair<F, S> x)
{
  cerr << '(';
  print(x.first);
  cerr << ',';
  print(x.second);
  cerr << ')';
}
template <typename T, size_t N>
struct Tuple
{
  static void printTuple(T t)
  {
    Tuple < T, N - 1 >::printTuple(t);
    cerr << ",", print(get < N - 1 > (t));
  }
};
template <typename T>
struct Tuple<T, 1>
{
  static void printTuple(T t) { print(get<0>(t)); }
};
template <typename... Args>
void print(tuple<Args...> t)
{
  cerr << "(";
  Tuple<decltype(t), sizeof...(Args)>::printTuple(t);
  cerr << ")";
}
template <typename... T>
void print(priority_queue<T...> pq)
{
  int f = 0;
  cerr << '{';
  while (!pq.empty())
    cerr << (f++ ? "," : ""), print(pq.top()), pq.pop();
  cerr << "}";
}
template <typename T>
void print(stack<T> st)
{
  int f = 0;
  cerr << '{';
  while (!st.empty())
    cerr << (f++ ? "," : ""), print(st.top()), st.pop();
  cerr << "}";
}
template <typename T>
void print(queue<T> q)
{
  int f = 0;
  cerr << '{';
  while (!q.empty())
    cerr << (f++ ? "," : ""), print(q.front()), q.pop();
  cerr << "}";
}
/* Printer functions */
void printer(const char *) {} /* Base Recursive */
template <typename T, typename... V>
void printer(const char *names, T &&head, V &&...tail)
{
  /* Using && to capture both lvalues and rvalues */
  int i = 0;
  for (size_t bracket = 0; names[i] != '\0' and (names[i] != ',' or bracket != 0); i++)
    if (names[i] == '(' or names[i] == '<' or names[i] == '{')
      bracket++;
    else if (names[i] == ')' or names[i] == '>' or names[i] == '}')
      bracket--;
  cerr.write(names, i) << " = ";
  print(head);
  if (sizeof...(tail))
    cerr << " ||", printer(names + i + 1, tail...);
  else
    cerr << "]\n";
}
/* PrinterArr */
void printerArr(const char *) {} /* Base Recursive */
template <typename T, typename... V>
void printerArr(const char *names, T arr[], size_t N, V... tail)
{
  size_t ind = 0;
  for (; names[ind] and names[ind] != ','; ind++)
    cerr << names[ind];
  for (ind++; names[ind] and names[ind] != ','; ind++)
    ;
  cerr << " = {";
  for (size_t i = 0; i < N; i++)
    cerr << (i ? "," : ""), print(arr[i]);
  cerr << "}";
  if (sizeof...(tail))
    cerr << " ||", printerArr(names + ind + 1, tail...);
  else
    cerr << "]\n";
}
}

#define debug(...) std::cerr << __LINE__ << ": [", __DEBUG_UTIL__::printer(#__VA_ARGS__, __VA_ARGS__);
#define debugArr(...) std::cerr << __LINE__ << ": [", __DEBUG_UTIL__::printerArr(#__VA_ARGS__, __VA_ARGS__);


mt19937 mt_rng(chrono::steady_clock::now().time_since_epoch().count());
ll randint(ll a, ll b) {
  return uniform_int_distribution<ll>(a, b)(mt_rng);
}
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/

const lld pi = 3.14159265358979323846;
const ll mod = 1000000007;
// const ll mod = 998244353;
// ll mod;
const ll INF = 1e18;
const int d4i[4] = { -1, 0, 1, 0}, d4j[4] = {0, 1, 0, -1};
const int d8i[8] = { -1, -1, 0, 1, 1, 1, 0, -1}, d8j[8] = {0, 1, 1, 1, 0, -1, -1, -1};
const int kni[8] = { +2, +2, -2, -2, 1, -1, 1, -1}, knj[8] = {1, -1, 1, -1, 2, 2, -2, -2};

ll n, m, k, q, l, r, x, y, z , h;
const ll tas = 510;
ll a;
ll b;
ll c;
ll dist[tas][tas];
ll d[tas];
string s, t;
vector<pii> grid[2000000];
// vector<pii> edges[tas];
ll ans = 0;

ll get(ll x, ll y, ll z) {
  return 3 * (m * x + y) + z;
}

void solve(int tc = 0) {

  cin >> n >> m;
  cin >> a;
  cin >> b;
  cin >> c;
  n++, m++;
  pii st, en;
  // debug(get(500, 500, 3))
  set<pair<ll, pii>> name1;
  cin >> k;
  FOR(n)FOR(j, 0, m) dist[i][j] = INF;
  // FOR(n)FOR(j, 0, m) d[get(i, j, 0)] = INF;
  // FOR(n)FOR(j, 0, m) d[get(i, j, 1)] = INF;
  FOR(n)FOR(j, 0, m) {
    // debug(i, j, 2, get(i, j, 2))
    // d[get(i, j, 2)] = INF;//
    assert(get(i, j, 2) < 2e6);
  }
  // debug(get(n - 1, m - 1, 2))
  // debug()
  FOR(k) {
    cin >> x >> y;
    if (i == 0) st = mp(x, y);
    if (i == k - 1) en = mp(x, y);
    // x--, y--;
    dist[x][y] = 0;
    name1.insert(mp(0, mp(x, y)));
  };
  // debug(en)
  // while (!name1.empty()) {
  //   pii cur = name1.begin()->s;
  //   // debug(cur, name1.begin()->f)
  //   name1.erase(name1.begin());
  //   FOR(4) {
  //     x = cur.f + d4i[i];
  //     y = cur.s + d4j[i];
  //     // debug(cur)
  //     if (x >= 0)
  //       if (y >= 0)
  //         if (x < n)
  //           if (y < m && dist[x][y] > dist[cur.f][cur.s] + 1) {
  //             // debug(x, y, cur)
  //             name1.erase(mp(dist[x][y], mp(x, y)));
  //             dist[x][y] = dist[cur.f][cur.s] + 1;
  //             name1.insert(mp(dist[x][y], mp(x, y)));
  //           }
  //   }
  // }
  // FOR(n) FOR(j, 0, m) {
  //   if (j - 1 >= 0) grid[get(i, j, 0)].pb(mp(a, get(i, j - 1, 0)));
  //   if (j + 1 < m) grid[get(i, j, 0)].pb(mp(a, get(i, j + 1, 0)));
  //   if (i - 1 >= 0) grid[get(i, j, 1)].pb(mp(a, get(i - 1, j, 1)));
  //   if (i + 1 < n) grid[get(i, j, 1)].pb(mp(a, get(i + 1, j, 1)));
  //   grid[get(i, j, 0)].pb(mp(c * dist[i][j], get(i, j, 2)));
  //   grid[get(i, j, 1)].pb(mp(c * dist[i][j], get(i, j, 2)));
  //   grid[get(i, j, 2)].pb(mp(b, get(i, j, 0)));
  //   grid[get(i, j, 2)].pb(mp(b, get(i, j, 1)));
  //   FOR(k, 0, 4) {
  //     x = i + d4i[k];
  //     y = j + d4j[k];
  //     if (0 <= x && 0 <= y && x < n && y < m) {
  //       grid[get(i, j, 2)].pb(mp(c, get(x, y, 2)));
  //     }
  //   }
  // }
  // set<pii> se;
  // se.insert(mp(0, get(st.f, st.s, 2)));
  // d[get(st.f, st.s, 2)] = 0;
  // // debug(get(st.f, st.s, 2))
  // while (!se.empty()) {
  //   auto cur = se.begin()->s;
  //   se.erase(se.begin());
  //   // debug(cur, d[cur])
  //   for (auto val : grid[cur])if (d[val.s] > d[cur] + val.f) {
  //       // debug(val.s, cur, val.f)
  //       se.erase(mp(d[val.s], val.s));
  //       d[val.s] = d[cur] + val.f;
  //       se.insert(mp(d[val.s], val.s));
  //     }
  // }
  // cout << d[get(en.f, en.s, 2)] << endl;
}

int main() {
  fastio

#ifdef LOCAL
  auto begin = std::chrono::high_resolution_clock::now();
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
  freopen("error.txt", "w", stderr);
#endif

  ll tc = 1;
  // cin >> tc;
  for (int t = 0; t < tc; t++) solve(t);
#ifdef LOCAL
  auto end = std::chrono::high_resolution_clock::now();
  auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
  // cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n";
#endif
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...