Submission #92387

#TimeUsernameProblemLanguageResultExecution timeMemory
92387davitmargLongest beautiful sequence (IZhO17_subsequence)C++17
23 / 100
6088 ms4756 KiB
/* DEATH-MATCH Davit-Marg */ #include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <map> #include <set> #include <queue> #include <deque> #include <stack> #include <iterator> #include <ctype.h> #include <stdlib.h> #include <cassert> #include <fstream> #define mod 998244353ll #define LL long long #define LD long double #define MP make_pair #define PB push_back using namespace std; int bitCount(int n) { int res = 0; while (n) { if (n & 1) res++; n >>= 1; } return res; } int bitCount(int a, int b) { return bitCount( (a&b) ); } int n, a[100005], k[100005],dp[100005],nxt[100005],last[(1<<20)+10],mx; vector<int> ans; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; mx = max(mx,a[i]); } for (int i = 1; i <= n; i++) cin >> k[i]; if (n<=5000 & 0) { for (int i = n; i >= 1; i--) { dp[i] = 1; for (int j = i + 1; j <= n; j++) if (bitCount(a[i], a[j]) == k[j] && dp[i] < 1 + dp[j]) { dp[i] = 1 + dp[j]; nxt[i] = j; } } mx = 0; for (int i = 1; i <= n; i++) mx = max(dp[i], mx); for (int i = 1; i <= n; i++) if (dp[i] == mx) { while (i) { ans.PB(i); i = nxt[i]; } break; } } else { for (int i = 1; i <= n; i++) { dp[i] = 1; for (int j = 0; j <= (1 << 20); j++) if (last[j] != 0 && bitCount(a[i], j) == k[i] && dp[i] <= 1 + dp[last[j]]) { dp[i] = 1 + dp[last[j]]; nxt[i] = last[j]; } last[a[i]] = i; } mx = 0; for (int i = 1; i <= n; i++) mx = max(dp[i], mx); for (int i = 1; i <= n; i++) if (dp[i] == mx) { while (i) { ans.PB(i); i = nxt[i]; } break; } } cout << ans.size() << endl; sort(ans.begin(), ans.end()); for (int i = 0; i < ans.size(); i++) cout << ans[i] << " "; cout << endl; return 0; } /* 11 5 5 13 17 7 17 5 5 1 5 5 2 2 2 1 2 2 1 1 1 1 2 7 5 5 13 17 7 17 5 2 2 2 1 2 1 1 2 8 9 20 0 5 5 3 5 3 5 10 1 20 1 20 4 1 2 3 4 10 0 1 0 */

Compilation message (stderr)

subsequence.cpp: In function 'int main()':
subsequence.cpp:60:7: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
  if (n<=5000 & 0)
      ~^~~~~~
subsequence.cpp:119:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < ans.size(); 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...