Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define pb push_back
- #define nl puts ("")
- #define sp printf ( " " )
- #define phl printf ( "hello\n" )
- #define ff first
- #define ss second
- #define POPCOUNT __builtin_popcountll
- #define RIGHTMOST __builtin_ctzll
- #define LEFTMOST(x) (63-__builtin_clzll((x)))
- #define MP make_pair
- #define FOR(i,x,y) for(vlong i = (x) ; i <= (y) ; ++i)
- #define ROF(i,x,y) for(vlong i = (y) ; i >= (x) ; --i)
- #define CLR(x,y) memset(x,y,sizeof(x))
- #define UNIQUE(V) (V).erase(unique((V).begin(),(V).end()),(V).end())
- #define MIN(a,b) ((a)<(b)?(a):(b))
- #define MAX(a,b) ((a)>(b)?(a):(b))
- #define NUMDIGIT(x,y) (((vlong)(log10((x))/log10((y))))+1)
- #define SQ(x) ((x)*(x))
- #define ABS(x) ((x)<0?-(x):(x))
- #define FABS(x) ((x)+eps<0?-(x):(x))
- #define ALL(x) (x).begin(),(x).end()
- #define LCM(x,y) (((x)/gcd((x),(y)))*(y))
- #define SZ(x) ((vlong)(x).size())
- #define NORM(x) if(x>=mod) x-=mod;if(x<0) x+=mod;
- #define MOD(x,y) (((x)*(y))%mod)
- #define ODD(x) (((x)&1)==0?(0):(1))
- #define Set(N,cur) N=(N|(1<<cur))
- #define Reset(N,cur) N=(N&(~(1<<cur)))
- #define Check(N,cur) (!((N&(1<<cur))==0))
- #define dbgA(A,i) debug("At pos: ",i," = ",A[i])
- #define fast_cin ios_base::sync_with_stdio(false);cin.tie(NULL)
- #ifdef forthright48
- #include <ctime>
- clock_t tStart = clock();
- #define debug(args...) {dbg,args; cerr<<endl;}
- #define timeStamp debug ("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)
- #define bug printf("%d\n",__LINE__);
- #else
- #define debug(args...) // Just strip off all debug tokens
- #define timeStamp
- #endif
- struct debugger{
- template<typename T> debugger& operator , (const T& v){
- cerr<<v<<" ";
- return *this;
- }
- }dbg;
- #define LL long long
- #define LLU long long unsigned int
- typedef long long vlong;
- typedef unsigned long long uvlong;
- typedef pair < int, int > pii;
- typedef pair < vlong, vlong > pll;
- inline vlong gcd ( vlong a, vlong b ) {
- a = ABS ( a ); b = ABS ( b );
- while ( b ) { a = a % b; swap ( a, b ); } return a;
- }
- vlong ext_gcd ( vlong A, vlong B, vlong *X, vlong *Y ){
- vlong x2, y2, x1, y1, x, y, r2, r1, q, r;
- x2 = 1; y2 = 0; x1 = 0; y1 = 1;
- for (r2 = A, r1 = B; r1 != 0; r2 = r1, r1 = r, x2 = x1, y2 = y1, x1 = x, y1 = y ) {
- q = r2 / r1; r = r2 % r1;
- x = x2 - (q * x1); y = y2 - (q * y1);
- }
- *X = x2; *Y = y2;
- return r2;
- }
- inline vlong modInv ( vlong a, vlong m ) {
- vlong x, y;
- ext_gcd( a, m, &x, &y );
- x %= m;
- if ( x < 0 ) x += m;
- return x;
- }
- inline vlong power ( vlong a, vlong p ) {
- vlong res = 1, x = a;
- while ( p ) {
- if ( p & 1 ) res = ( res * x );
- x = ( x * x ); p >>= 1;
- }
- return res;
- }
- inline vlong bigmod ( vlong a, vlong p, vlong m ) {
- vlong res = 1 % m, x = a % m;
- while ( p ) {
- if ( p & 1 ) res = ( res * x ) % m;
- x = ( x * x ) % m; p >>= 1;
- }
- return res;
- }
- inline int STRLEN(char *s){
- int p = 0; while(s[p]) p++; return p;
- }
- inline LL SQRT(LL a){
- LL v = sqrt(a);
- if(SQ(v) == a) return v;
- else if(SQ(v+1) == a) return v+1;
- else if(SQ(v+2) == a) return v+2;
- else return -1; /// a can no be written as p^2
- }
- //int knightDir[8][2] = { {-2,1},{-1,2},{1,2},{2,1},{2,-1},{-1,-2},{1,-2},{-2,-1} };
- //int dir4[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
- //int dir8[8][2] = {{-1,0},{0,1},{1,0},{0,-1},{-1,-1},{1,1},{1,-1},{-1,1}};
- const int inf = 100000000;
- const double pi = 2 * acos ( 0.0 );
- const double eps = 1e-9;
- ///========================= TEMPLATE ENDS HERE ========================///
- ///=======================================================================///
- const int Size = 5005;
- int N,M;
- int A1[Size];
- int A2[Size];
- int DP[Size]; /// DP[j] = LISS till j in A2 (i in A1 can be anywhere).
- vector<pii> POS[Size]; /// POS[j] store all possible i such that A1[i] = A2[j] and LISS till then.
- vector<int> res;
- int ans = 0;
- void printLISS(){
- if(ans == 0) return;
- int prvI = inf;
- int prvVal = inf;
- for(int j = M-1;j>=0;j--){
- if(A2[j] >= prvVal) continue;
- for(int c = 0;c<POS[j].size();c++){
- int i = POS[j][c].ff;
- int mxCnt = POS[j][c].ss;
- if(mxCnt == ans && i<prvI){
- ans--;
- prvI = i;
- prvVal = A2[j];
- res.pb(A2[j]);
- break;
- }
- }
- }
- reverse(ALL(res));
- for(int i = 0;i<res.size();i++){
- if(i != 0) printf(" ");
- printf("%d",res[i]);
- }
- printf("\n");
- }
- void LISS(){
- for(int i = 0;i<N;i++){
- int mxCnt = 0;
- for(int j = 0;j<M;j++){
- if(A1[i] == A2[j]){ /// 1 new match
- DP[j] = max(DP[j], mxCnt+1);
- ans = max(ans, mxCnt+1);
- POS[j].pb(MP(i, mxCnt+1));
- }else if(A2[j] < A1[i]){
- /// As A2[j] is smaller now, so it's possible to increase j for fixed i
- mxCnt = max(mxCnt, DP[j]); /// Update best LISS till now.
- }
- }
- }
- printf("%d\n",ans);
- printLISS();
- }
- int main(){
- #ifdef forthright48
- freopen ( "input.txt", "r", stdin );
- //freopen ( "output.txt", "w", stdout );
- #endif // forthright48
- scanf("%d",&N);
- for(int i = 0;i<N;i++){
- scanf("%d",&A1[i]);
- }
- scanf("%d",&M);
- for(int i = 0;i<M;i++){
- scanf("%d",&A2[i]);
- }
- LISS();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement