제출 #1165075

#제출 시각아이디문제언어결과실행 시간메모리
1165075ThanhsVrtić (COCI18_vrtic)C++20
0 / 160
2096 ms324 KiB
#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; #define name "vrtic" #define fi first #define se second // #define endl '\n' #define setmin(x, y) x = min((x), (y)) #define setmax(x, y) x = max((x), (y)) #define sqr(x) ((x) * (x)) mt19937 hdp(chrono::high_resolution_clock::now().time_since_epoch().count()); int rand(int l, int r){return l + ((hdp() % (r - l + 1)) + r - l + 1) % (r - l + 1);} const int NM = 150 + 5; vector<int> nen; int n, mx, c[NM], a[NM], id[NM], jump[NM], JUMP[NM], p[NM], ans[NM]; bool b[NM]; map<vector<int>, bool> mp; vector<vector<int>> v[NM]; vector<pair<int, int>> cr; vector<int> get(int l, int r) { vector<bool> vis(n + 1); vector<int> res; int cr = l; vis[l] = 1; res.push_back(l); while (cr != r) { cr = min(r, jump[cr]); res.push_back(cr); vis[cr] = 1; } for (int i = r; i >= l; i--) if (!vis[i]) res.push_back(i); for (auto& t : res) t = id[t]; return res; } void trace(int l, vector<int> C) { if (l == n + 1) { for (auto& t : cr) { vector<int> T = get(t.fi, t.fi + t.se - 1); for (int i = 0; i < t.se; i++) ans[v[t.se].back()[i]] = T[i]; v[t.se].pop_back(); } for (int i = 1; i <= n; i++) cout << ans[i] << ' '; exit(0); } for (int i = 0; i < (int)C.size() && nen[i] <= JUMP[l] - l + 1; i++) if (C[i]) { C[i]--; cr.push_back({l, nen[i]}); if (l + nen[i] == n + 1 || mp[C]) trace(l + nen[i], C); cr.pop_back(); C[i]++; } } bool bt(int l, vector<int> C) { if (l == n + 1) return 1; if (mp.count(C)) return mp[C]; for (int i = 0; i < (int)C.size() && nen[i] <= JUMP[l] - l + 1; i++) if (C[i]) { C[i]--; if (bt(l + nen[i], C)) { C[i]++; return mp[C] = 1; } C[i]++; } return mp[C] = 0; } bool calc(int x, bool tr) { for (int i = n; i >= 1; i--) jump[i] = upper_bound(a + 1, a + 1 + n, a[i] + x) - a - 1; for (int i = n; i >= 1; i--) { if (jump[i] == i) JUMP[i] = i; else if (jump[jump[i] - 1] <= jump[i]) JUMP[i] = jump[i]; else JUMP[i] = JUMP[jump[i]]; } vector<int> C(nen.size()); for (int i = 0; i < nen.size(); i++) C[i] = c[i]; mp.clear(); if (!tr) return bt(1, C); bt(1, C); trace(1, C); return 0; } void solve() { cin >> n >> n; for (int i = 1; i <= n; i++) cin >> p[i]; for (int i = 1; i <= n; i++) cin >> a[i]; iota(id + 1, id + 1 + n, 1); sort(id + 1, id + 1 + n, [&](const int& x, const int& y) {return a[x] < a[y];}); sort(a + 1, a + 1 + n); for (int i = 1; i <= n; i++) if (!b[i]) { int cnt = 1; b[i] = 1; int t = p[i]; while (t != i) { cnt++; b[t] = 1; t = p[t]; } c[cnt]++; nen.push_back(cnt); v[cnt].emplace_back(); v[cnt].back().push_back(i); t = p[i]; while (t != i) { v[cnt].back().push_back(t); t = p[t]; } } sort(nen.begin(), nen.end()); nen.erase(unique(nen.begin(), nen.end()), nen.end()); for (int i = 1; i <= n; i++) if (c[i]) c[lower_bound(nen.begin(), nen.end(), i) - nen.begin()] = c[i]; int l = -1, r = 1e9; while (l < r - 1) { int m = l + r >> 1; (calc(m, 0) ? r : l) = m; } cout << r << endl; calc(r, 1); } signed main() { if (fopen("in.txt", "r")) { freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); } else if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int tc = 1; while (tc--) solve(); }

컴파일 시 표준 에러 (stderr) 메시지

vrtic.cpp: In function 'int main()':
vrtic.cpp:169:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  169 |         freopen("in.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
vrtic.cpp:170:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  170 |         freopen("out.txt", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
vrtic.cpp:174:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  174 |         freopen(name".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
vrtic.cpp:175:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  175 |         freopen(name".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...