제출 #96946

#제출 시각아이디문제언어결과실행 시간메모리
96946KastandaSwap (BOI16_swap)C++11
68 / 100
1163 ms160308 KiB
// Borrowed. #include<bits/stdc++.h> using namespace std; const int N = 4e5 + 10; int n, l, r, A[N], R[N], rev[N]; set < int > S[N], B[N]; bitset < N > M; inline bool Check(int id, int val) { if (M[val]) return (1); while (id) { if (B[id].count(val)) return (1); id >>= 1; } return (0); } inline bool Sub(int id, int pr) { while (id) { if (id == pr) return (1); id >>= 1; } return (0); } int main() { scanf("%d", &n); memset(A, 1, sizeof(A)); for (int i = 1; i <= n; i++) scanf("%d", &A[i]), S[i].insert(A[i]), rev[A[i]] = i; for (int i = 1; i <= n; i++) { int lc = i * 2, rc = lc + 1; int best = *S[i].begin(); while (Check(i, best)) { S[i].erase(S[i].begin()); assert(S[i].size() != 0); best = *S[i].begin(); } if (best < A[lc] && best < A[rc]) { R[i] = best; M[best] = 1; if (Sub(i, rev[best])) { int pr = rev[best], id = i; while (id > pr) { for (auto X : S[(id >> 1)]) B[id^1].insert(X); B[id].insert(A[id ^1]); id >>= 1; S[id].clear(); } } else { int pr = rev[best]; B[pr].insert(A[pr]); for (auto X : S[(pr >> 1)]) B[pr^1].insert(X); int id = i; pr ^= 1; while (id > pr) { for (auto X : S[(id >> 1)]) B[id^1].insert(X); B[id].insert(A[id ^1]); id >>= 1; S[id].clear(); } } //S[i].clear(); continue; } if (A[lc] < A[rc]) { R[i] = A[lc]; M[R[i]] = 1; S[lc].clear(); for (auto X : S[i]) S[lc].insert(X); //S[i].clear(); continue; } R[i] = A[rc]; M[R[i]] = 1; S[rc].clear(); S[rc].insert(A[lc]); S[lc].insert(A[lc]); for (auto X : S[i]) { S[lc].insert(X); S[rc].insert(X); } //S[i].clear(); } for (int i = 1; i <= n; i++) printf("%d ", R[i]); }

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

swap.cpp: In function 'int main()':
swap.cpp:32:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
swap.cpp:35:46: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &A[i]), S[i].insert(A[i]), rev[A[i]] = i;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
#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...