제출 #298642

#제출 시각아이디문제언어결과실행 시간메모리
298642caoashLongest beautiful sequence (IZhO17_subsequence)C++14
40 / 100
115 ms4608 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using vi = vector<int>; using vl = vector<ll>; #define pb push_back #define rsz resize #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() using pi = pair<int,int>; #define f first #define s second #define mp make_pair const int MX = 200005; const int MOD = (int) (1e9 + 7); namespace output { void pr(int x) { cout << x; } void pr(long x) { cout << x; } void pr(ll x) { cout << x; } void pr(unsigned x) { cout << x; } void pr(unsigned long x) { cout << x; } void pr(unsigned long long x) { cout << x; } void pr(float x) { cout << x; } void pr(double x) { cout << x; } void pr(long double x) { cout << x; } void pr(char x) { cout << x; } void pr(const char* x) { cout << x; } void pr(const string& x) { cout << x; } void pr(bool x) { pr(x ? "true" : "false"); } template<class T1, class T2> void pr(const pair<T1,T2>& x); template<class T> void pr(const T& x); template<class T, class... Ts> void pr(const T& t, const Ts&... ts) { pr(t); pr(ts...); } template<class T1, class T2> void pr(const pair<T1,T2>& x) { pr("{",x.f,", ",x.s,"}"); } template<class T> void pr(const T& x) { pr("{"); // const iterator needed for vector<bool> bool fst = 1; for (const auto& a: x) pr(!fst?", ":"",a), fst = 0; pr("}"); } void ps() { pr("\n"); } // print w/ spaces template<class T, class... Ts> void ps(const T& t, const Ts&... ts) { pr(t); if (sizeof...(ts)) pr(" "); ps(ts...); } void pc() { cout << "]" << endl; } // debug w/ commas template<class T, class... Ts> void pc(const T& t, const Ts&... ts) { pr(t); if (sizeof...(ts)) pr(", "); pc(ts...); } #define dbg(x...) pr("[",#x,"] = ["), pc(x); } #ifdef LOCAL using namespace output; #endif int n; void solve1() { vi a(n), k(n), fr(n), dp(n); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> k[i]; } dp[0] = 1; for (int i = 1; i < n; i++) { dp[i] = 1; for (int j = 0; j < i; j++) { if (__builtin_popcount(a[i] & a[j]) == k[i]) { if (dp[j] + 1 > dp[i]) { dp[i] = dp[j] + 1; fr[i] = j; } } } } pi fin = mp(INT_MIN, -1); for (int i = 0; i < n; i++) { if (dp[i] > fin.f) { fin = mp(dp[i], i); } } cout << fin.f << '\n'; int curr = fin.s; vi ret; while (dp[curr] != 1) { ret.pb(curr); curr = fr[curr]; } ret.pb(curr); for (int i = sz(ret) - 1; i >= 0; i--) { cout << ret[i] + 1 << " "; } cout << '\n'; } void solve2() { vi a(n), k(n), fr(n), dp(n); pi best[(1 << 8)]; memset(best, 0, sizeof(best)); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> k[i]; } dp[0] = 1; best[a[0]] = mp(1, 0); for (int i = 1; i < n; i++) { dp[i] = 1; for (int j = 0; j < (1 << 8); j++) { if (__builtin_popcount(a[i] & j) == k[i]) { if (best[j].f + 1 > dp[i]) { dp[i] = best[j].f + 1; fr[i] = best[j].s; } } } best[a[i]] = max(best[a[i]], mp(dp[i], i)); } pi fin = mp(0, 0); for (int i = 0; i < n; i++) { if (dp[i] > fin.f) { fin = mp(dp[i], i); } } cout << fin.f << '\n'; int curr = fin.s; vi ret; while (dp[curr] != 1) { ret.pb(curr); curr = fr[curr]; } ret.pb(curr); for (int i = sz(ret) - 1; i >= 0; i--) { cout << ret[i] + 1 << " "; } cout << '\n'; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> n; if (n <= 5000) { solve1(); } else { solve2(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...