QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#731408#9564. Hey, Have You Seen My Kangaroo?ucup-team3215ML 0ms34544kbC++202.6kb2024-11-10 03:27:112024-11-10 03:27:12

Judging History

你现在查看的是最新测评结果

  • [2024-11-10 03:27:12]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:34544kb
  • [2024-11-10 03:27:11]
  • 提交

answer

#define tm xndisfbcgsf
#include <bits/stdc++.h>
#undef tm

using namespace std;

constexpr int N = 2e5, L = 40;

string s, a;
int n, m, k, jump[L][N], mark[N], tm;
vector<int> preim[N];
vector<int> merges;

void adv(int& i, int& j, int k) {
  int di = s[k] == 'U'? -1: s[k] == 'D';
  int dj = s[k] == 'L'? -1: s[k] == 'R';
  if (i + di >= 0 && i + di < n && j + dj >= 0 && j + dj < m && a[(i + di) * m + j + dj] == '1') i += di, j += dj;
}

int getpos(int i, int t) {
  for (int l = L; l--; ) if (t >> l & 1) i = jump[l][i];
  return i;
}

//int sz(const vector<int>& v, int t) {
//  ++tm;
//  int res = 0;
//  for (auto v: v) {
//    v = getpos(v, t);
//    res += mark[v] != tm;
//    mark[v] = tm;
//  }
//  return res;
//}

vector<int> shrink(const vector<int>& v, int l) {
  vector<int> res;
  ++tm;
  for (auto v: v) {
    v = jump[l][v];
    if (mark[v] != tm) res.push_back(v);
    mark[v] = tm;
  }
  return res;
}

void solve1(vector<int> v, int t) {
  vector<int> u;
  for (int i = 0; i < k; ++i) {
    ++tm;
    for (auto v: v) {
      int r = v / m, j = v % m;
      adv(r, j, i);
      v = r * m + j;
      if (mark[v] != tm) u.push_back(v), mark[v] = tm;
      else merges.push_back(t * k + i + 1);
    }
    swap(v = {}, u);
  }
  assert(v.size() == 1);
}

void solve(vector<int> v, int t) {
  int dt = 0;
  auto u = v;
  for (int l = L; l--; ) {
    auto w = shrink(u, l);
    if (w.size() * 2 >= v.size() && w.size() > 1) dt += 1 << l, swap(u, w);
  }
  if (!dt) u = shrink(u, 0), dt = 1;
  if (u.size() == v.size()) return;
  if (u.size() == 1 && dt == 1) return solve1(move(v), t);
  solve(u, t + dt);
  for (auto v: v) preim[getpos(v, dt)].push_back(v);
  vector<pair<int, vector<int>>> val;
  for (auto v: u) val.emplace_back(v, move(preim[v]));
  for (auto& [u, v]: val) solve(move(v), t);
}

int main() {
  cin.tie(0)->sync_with_stdio(0);
  cin >> n >> m >> k >> s;
  string t;
  for (int i = 0; i < n; ++i) cin >> t, a += t;
  vector<int> all;
  for (int i = 0; i < n; ++i)
  for (int j = 0; j < m; ++j) if (a[i * m + j] == '1') {
    all.push_back(i * m + j);
    int ti = i, tj = j;
    for (int i = 0; i < k; ++i) adv(ti, tj, i);
    jump[0][i * m + j] = ti * m + tj;
  }
  for (int l = 0; l < L - 1; ++l)
  for (int i = 0; i < n * m; ++i) jump[l + 1][i] = jump[l][jump[l][i]];
  solve(all, 0);
  sort(merges.begin(), merges.end());
  vector<int> ans(all.size(), -1);
  copy(merges.begin(), merges.end(), ans.rbegin());
  ans.erase(ans.begin());
  ans.resize(n * m);
  for (auto ans: ans) cout << ans << '\n';
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 34544kb

input:

3 3 6
ULDDRR
010
111
010

output:

-1
4
2
1
0
0
0
0
0

result:

ok 9 numbers

Test #2:

score: -100
Memory Limit Exceeded

input:

3 3 6
ULDDRR
010
111
011

output:


result: