# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
921996 | phong | Uzastopni (COCI15_uzastopni) | C++17 | 40 ms | 2720 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.
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define ll long long
const int nmax = 2e5 + 100;
const ll oo = 1e18, base = 311;
const int lg = 19, M = 10;
const ll mod = 1e9 + 7;
#define pii pair<int, int>
#define fi first
#define se second
#define debug(a, n) for(int i = 1; i <= n; ++i) cout << a[i] << ' ';
using namespace std;
int n, k[nmax], a[nmax];
namespace subtask2{
int dp[nmax];
bool check(){
if(n <= 5e3) return 1;
return 0;
}
void sol(){
int ans = 0;
for(int i = 1; i <= n; ++i){
dp[i] = 1;
for(int j = 1; j < i; ++j){
int x = __builtin_popcount(a[i] & a[j]);
// cout << x << ' ';
if(x == k[i]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
// cout << "\n";
ans = max(ans, dp[i]);
}
cout << ans << "\n";
vector<int> v;
for(int i = 1; i <= n; ++i){
if(dp[i] == ans){
int id = i;
while(ans > 0){
v.push_back(id);
for(int j = 1; j < id; ++j){
int x = __builtin_popcount(a[id] & a[j]);
// cout << x << ' ';
if(x == k[id] && dp[id] == dp[j] + 1){
id = j;
break;
}
}
--ans;
}
}
}
reverse(v.begin(), v.end());
for(auto p : v) cout << p << ' ';
}
}
namespace subtask3{
int trace[nmax];
bool check(){
if(*max_element(a + 1, a + 1 + n) < (1 << M)) return 1;
return 0;
}
int gg[nmax];
void sol(){
int ans = 0;
vector<pii> dp, f;
dp.resize(1 << M);
f.resize(1 << M);
for(int i = 1; i <= n; ++i){
for(int msk = 0; msk < (1 << M); ++msk){
int x = __builtin_popcount(msk & a[i]);
if(x == k[i]){
int &cur = dp[a[i]].fi;
if(cur < f[msk].fi + 1){
cur = f[msk].fi + 1;
trace[i] = f[msk].se;
}
}
}
dp[a[i]].fi = max(dp[a[i]].fi, 1);
for(int msk = 0; msk < (1 << M); ++msk){
if(dp[msk].fi != f[msk].fi){
dp[msk].se = i;
}
gg[i] = max(gg[i], dp[msk].fi);
}
f = dp;
}
int id = 0;
for(int i = 1; i <= n; ++i){
if(gg[id] < gg[i]){
id = i;
}
}
cout << gg[id] << "\n";
vector<int> v;
while(id > 0){
v.push_back(id);
id = trace[id];
}
reverse(v.begin(), v.end());
for(auto p : v) cout << p << ' ';
// for(int )
}
}
namespace subtask4{
pii dp[1 << M][21][1 << M];
int f[nmax], trace[nmax];
int bit(int msk, int x){
return msk >> x & 1;
}
void sol(){
for(int i = 1; i <= n; ++i){
f[i] = 1;
int pre = 0, suf = 0;
for(int j = 0; j < M; ++j){
if(bit(a[i], j)) pre |= 1 << j;
}
for(int j = M; j < 2 * M; ++j){
if(bit(a[i], j)) suf |= 1 << j;
}
for(int msk = 0; msk < (1 << M); ++msk){
int x = __builtin_popcount(suf& msk);
if(x <= k[i]){
auto cur = dp[pre][k[i] - x][msk];
if(f[i] < cur.fi + 1){
f[i] = cur.fi + 1;
trace[i] = cur.se;
}
}
}
for(int msk = 0; msk < (1 << M); ++msk){
int x = __builtin_popcount(msk & pre);
auto &cur = dp[msk][x][suf];
if(cur.fi < f[i]) cur = {f[i], i};
}
}
int id = 0;
for(int i = 1; i <= n; ++i){
if(f[id] < f[i]){
id = i;
}
}
cout << f[id] << "\n";
vector<int> v;
while(id > 0){
v.push_back(id);
id = trace[id];
}
reverse(v.begin(), v.end());
for(auto p : v) cout << p << ' ';
}
}
main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// freopen("code.inp", "r", stdin);
// freopen("code.out", "w", stdout);
cin >> n;
for(int i = 1; i <= n; ++i) cin >> a[i];
for(int i = 1; i <= n; ++i) cin >> k[i];
if(subtask2::check()) return subtask2::sol(), 0;
if(subtask3::check()) return subtask3::sol(), 0;
subtask4::sol();
}
/*
4
1 2 3 4
10 0 1 0
5
5 3 5 3 5
10 1 20 1 20
*/
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |