fork download
  1. /*
  2.   _.-- ,.--.
  3.   .' .' /
  4.   @ |'..--------._
  5.   / \._/ '.
  6.   / .-.- \
  7.   ( / \ \
  8.   \\ '. | #
  9.   \\ \ -. /
  10.   :\ | )._____.' \
  11.   " | / \ | \ )
  12.   | |./' :__ \.-'
  13.   '--'
  14. */
  15. #include <bits/stdc++.h>
  16. #define ll long long
  17. #define endl "\n"
  18. #define file "b"
  19. #define pb push_back
  20. #define pll pair<ll, ll>
  21. using namespace std;
  22. const ll maxn = 1e6 + 3, maxm = 3e3+2, maxk = 1e4 + 2;
  23. const ll INF = 1e18 + 1;
  24. ll n, m, t = 0, ans = 0,l, r, cnt = 0, k = 0, cur;
  25. bool cn = false;
  26. ll A[maxn], B[maxn];
  27. ll dx[] = {0, 0, -1, 1};
  28. ll dy[] = {1, -1, 0, 0};
  29. vector<pll> v[maxn];
  30. pll p[maxn];
  31. bool _cmp(pll x, pll y){
  32. return x.second > y.second;
  33. }
  34. void mofile(){
  35. if(fopen(file".inp", "r")){
  36. freopen(file".inp", "r", stdin);
  37. freopen(file".out", "w", stdout);
  38. }
  39. }
  40. void faster(){
  41. ios::sync_with_stdio(0);
  42. cin.tie(nullptr); cout.tie(nullptr);
  43. }
  44. /*-------------------------------------*/
  45. struct haitay2vumombulozem{
  46. ll maxx, minn, len, xuong;
  47. }dp[maxm][maxm];
  48. void solve(){
  49. cin >> n >> m;
  50. for(int i = 1; i <= n; i++) cin >> A[i];
  51. for(int i = 1; i <= m; i++) cin >> B[i];
  52. for(int i = 0; i <= n; i++){
  53. for(int j = 0; j <= m; j++){
  54. dp[i][j].minn = -INF;
  55. dp[i][j].maxx = INF;
  56. dp[i][j].len = dp[i][j].xuong = 0;
  57. }
  58. }
  59. for(int i = 1; i <= n; i++){
  60. for(int j = 1; j <= m; j++){
  61. if(A[i]==B[j]){
  62. if(dp[i-1][j-1].minn < A[i]){
  63. dp[i][j].maxx = A[i];
  64. dp[i][j].len = dp[i-1][j-1].xuong + 1;
  65. }
  66. if(dp[i-1][j-1].maxx > A[i]){
  67. dp[i][j].minn = A[i];
  68. dp[i][j].xuong = dp[i-1][j-1].len + 1;
  69. }
  70. }
  71. else{
  72. if(dp[i-1][j].len > dp[i][j-1].len){
  73. dp[i][j].len = dp[i-1][j].len;
  74. dp[i][j].maxx = dp[i-1][j].maxx;
  75. }
  76. else if(dp[i-1][j].len < dp[i][j-1].len){
  77. dp[i][j].len = dp[i][j-1].len;
  78. dp[i][j].maxx = dp[i][j-1].maxx;
  79. }
  80. else{
  81. dp[i][j].len = dp[i-1][j].len;
  82. dp[i][j].maxx = max(dp[i][j-1].maxx, dp[i-1][j].maxx);
  83. }
  84. //xuong
  85. if(dp[i-1][j].xuong > dp[i][j-1].xuong){
  86. dp[i][j].xuong = dp[i-1][j].xuong;
  87. dp[i][j].minn = dp[i-1][j].minn;
  88. }
  89. else if(dp[i-1][j].xuong < dp[i][j-1].xuong){
  90. dp[i][j].xuong = dp[i][j-1].xuong;
  91. dp[i][j].minn = dp[i][j-1].minn;
  92. }
  93. else{
  94. dp[i][j].xuong = dp[i-1][j].xuong;
  95. dp[i][j].minn = min(dp[i][j-1].minn, dp[i-1][j].minn);
  96. }
  97. }
  98. }
  99. }
  100. cout << max(dp[n][m].len, dp[n][m].xuong);
  101. }
  102. /*------------------------------------------*/
  103. main(){
  104. faster();
  105. mofile();
  106. ll tt = 1;
  107. //cin >> tt;
  108. while(tt--)
  109. solve();
  110. }
  111.  
Success #stdin #stdout 0.01s 28116KB
stdin
Standard input is empty
stdout
Standard output is empty