# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
35051 | model_code | Longest beautiful sequence (IZhO17_subsequence) | C++14 | 4316 ms | 56972 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <ctime>
#define pb push_back
#define ll long long
#define mp make_pair
#define f first
#define s second
#define pii pair < int, int >
#define ull unsigned long long
#define pll pair < ll, ll >
#define forit(it, s) for(__typeof(s.begin()) it = s.begin(); it != s.end(); it ++)
#define all(s) s.begin(), s.end()
#define sz(a) (int)a.size()
const int inf = (1ll << 30) - 1;
const int maxn = (int) 1e5 + 10;
using namespace std;
int dp[(1<<20)+ 10][10 + 3];
int a[100100];
int prv[100100];
int k[100100];
int mx[100100];
int cnt[(1<<10) + 10];
int n;
void solve(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
for(int i = 1; i <= n; i++){
scanf("%d", &k[i]);
}
for(int i = 0; i < (1<<10); i++)
cnt[i] = __builtin_popcount(i);
for(int i = 1; i <= n; ++i){
int x = a[i] & ((1<<10)-1);
int y = (a[i] >> 10) & ((1<<10)-1);
int &cur = mx[i];
int &ind = prv[i];
for(int mask = 0; mask < (1<<10); mask++){
int K = k[i] - cnt[mask & y];
if(K < 0 || K > 10) continue;
int &cc = dp[(mask<<10)|x][K];
if(mx[cc] > cur){
cur = mx[cc];
ind = cc;
}
}
cur++;
for(int mask = 0; mask < (1<<10); ++mask){
int K = cnt[mask & x];
int &cc = dp[(y<<10)|mask][K];
if(mx[cc] < cur){
cc = i;
}
}
}
int j = 0;
for(int i = 1; i <= n; i++){
if(mx[j] < mx[i]){
j = i;
}
}
vector<int> ans;
while(j){
ans.pb(j);
j = prv[j];
}
reverse(all(ans));
printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); i++){
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
int main () {
int t=1;
//scanf("%d", &t);
for(int i=1; i <= t; i++){
//printf("Case #%d\n", i);
solve();
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |