제출 #393546

#제출 시각아이디문제언어결과실행 시간메모리
393546SirCovidThe19thLongest beautiful sequence (IZhO17_subsequence)C++14
0 / 100
22 ms45432 KiB
#include <bits/stdc++.h> using namespace std; /* dp[i][j][k] - given that there must be k set bits in i(which is a mask for possible values of first 10 bits of another value that is valid with the current value) and j is last 10 bits - j consists of only values we have seen so far -> crucial to understanding first loop through all possible values for j(read dp description). we can then calculate(variable b) the amount of set bits required in i(which is the left 10). so: dp[left][possible value][k] -> we do this to find index with longest chain that includes the current value then we update dp array. loop through all possible values for i; given that j(read dp description) is right(the variable). */ int main(){ int n; cin >> n; int a[n+1], k[n+1]; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> k[i]; int popCnt[1024]; for (int i = 0; i < 1024; i++) popCnt[i] = __builtin_popcount(i); static int dp[1024][1024][11]; memset(dp, 0, sizeof(dp)); //at index i what is the longest chain you can form int best[n+1]; fill(best, best+n+1, 0); //at index i what is the first element in the longest //chain you can form so far int store[n+1]; for (int i = 1; i <= n; i++){ int right = a[i]&1023; int left = a[i]>>10; int idx = 0; for (int mask = 0; mask < 1024; mask++){ int b = k[i]-popCnt[(right&mask)]; if (b >= 0 and b <= 10) if (best[dp[left][mask][b]] > best[idx]) idx = dp[left][mask][b]; } best[i] = best[idx]+1; store[i] = idx; for (int mask = 0; mask < 1024; mask++){ int b = max(popCnt[(left&mask)]-popCnt[right], 0); if (best[i] > best[dp[mask][right][b]]) dp[mask][right][b] = i; } } int pos = max_element(best, best+n+1)-best; vector<int> res; while (pos != 0){ res.push_back(pos); pos = store[pos]; } reverse(res.begin(), res.end()); cout<<res.size()<<endl; for (int i = 0; i < res.size(); i++) cout<<res[i]<<" "; }

컴파일 시 표준 에러 (stderr) 메시지

subsequence.cpp: In function 'int main()':
subsequence.cpp:69:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |     for (int i = 0; i < res.size(); i++) cout<<res[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...