제출 #298794

#제출 시각아이디문제언어결과실행 시간메모리
298794caoashLongest beautiful sequence (IZhO17_subsequence)C++14
0 / 100
26 ms45440 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 = 100005; 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 pi dp[MX]; int best[(1 << 10)][(1 << 10)][11]; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vi a(n), k(n); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> k[i]; } memset(best, -1, sizeof(best)); for (int i = 0; i < n; i++) { dp[i] = mp(1, -1); //get current dp int fmask = (a[i] >> 10); int smask = (a[i] & 1023); // dbg(fmask, smask); for (int mask = 0; mask < (1 << 10); mask++) { int tmask = fmask & mask; int rem = k[i] - __builtin_popcount(tmask); if (rem < 0 || rem > 10) { continue; } int fr = best[mask][smask][rem]; if(fr != -1) { // dbg(i, mask, smask, rem, fr); dp[i] = max(dp[i], mp(dp[fr].f + 1, fr)); } } //update future dp for (int mask = 0; mask < (1 << 10); mask++) { int cnt = __builtin_popcount(smask & mask); if(best[fmask][mask][cnt] != -1 && dp[i] > dp[best[fmask][mask][cnt]]) { best[fmask][mask][cnt] = i; } } // dbg(i, dp[i]); } pi curr = mp(-1, -1); for (int i = 0; i < n; i++) { curr = max(curr, mp(dp[i].f, i)); } cout << curr.f << '\n'; vi ret; while (curr.s != -1) { ret.pb(curr.s); curr = mp(curr.f, dp[curr.s].s); } reverse(all(ret)); for (int i = 0; i < sz(ret); i++) { cout << ret[i] + 1 << " "; } cout << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...