#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> //#pragma GCC target ("avx2") //#pragma GCC optimize ("Ofast") //#pragma GCC optimize ("unroll-loops") #define f first #define s second #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define sz(x) ((int) (x).size()) #define pb push_back #define mp make_pair #define int long long using namespace std; using namespace __gnu_pbds; template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template <typename T> inline bool umin(T &a, const T &b) { if(a > b) { a = b; return 1; } return 0; } template <typename T> inline bool umax(T &a, const T &b) { if(a < b) { a = b; return 1; } return 0; } typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const ll mod = 998244353; const ll base = 1e6 + 9; const ll inf = 1e18; const int MAX = 2e5 + 42; const int LG = 20; //random_device rd; //mt19937 gen(rd()); //uniform_int_distribution<ll> dis(1, inf); int calc(const vector<int> &a) { int n = sz(a); int ans = 1; for(int i = 0; i + 1 < n; i++) { int j = i; while(j + 1 < n && (a[j + 1] > a[j]) == (a[i + 1] > a[i])) j++; umax(ans, j - i + 1); i = j - 1; } return ans; } int f(const vector<int> &a, const vector<int> &b) { int n = sz(a), m = sz(b); vector<int> p(n + m, 1); for(int i = 0; i < n; i++) p[i] = 0; int ans = inf; do { vector<int> c(n + m); int f = 0, s = 0; for(int i = 0; i < n + m; i++) { if(p[i]) c[i] = b[s++]; else c[i] = a[f++]; } umin(ans, calc(c)); } while(next_permutation(all(p))); return ans; } void solve() { int n, m; cin >> n >> m; vector<int> a(n), b(m); for(auto &i : a) cin >> i; for(auto &i : b) cin >> i; vector<int> ans(n + m + 1); for(int i = 0; i < n; i++) { vector<int> ca; for(int j = i; j < n; j++) { ca.pb(a[j]); for(int l = 0; l < m; l++) { vector<int> cb; for(int r = l; r < m; r++) { cb.pb(b[r]); int curr = f(ca, cb); ans[curr]++; } } } } for(int i = 1; i <= n + m; i++) cout << ans[i] << " "; cout << '\n'; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int ttt = 1; // cin >> ttt; while(ttt--) { solve(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> //#pragma GCC target ("avx2") //#pragma GCC optimize ("Ofast") //#pragma GCC optimize ("unroll-loops") #define f first #define s second #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define sz(x) ((int) (x).size()) #define pb push_back #define mp make_pair #define int long long using namespace std; using namespace __gnu_pbds; template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template <typename T> inline bool umin(T &a, const T &b) { if(a > b) { a = b; return 1; } return 0; } template <typename T> inline bool umax(T &a, const T &b) { if(a < b) { a = b; return 1; } return 0; } typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const ll mod = 998244353; const ll base = 1e6 + 9; const ll inf = 1e18; const int MAX = 2e5 + 42; const int LG = 20; //random_device rd; //mt19937 gen(rd()); //uniform_int_distribution<ll> dis(1, inf); int calc(const vector<int> &a) { int n = sz(a); int ans = 1; for(int i = 0; i + 1 < n; i++) { int j = i; while(j + 1 < n && (a[j + 1] > a[j]) == (a[i + 1] > a[i])) j++; umax(ans, j - i + 1); i = j - 1; } return ans; } int f(const vector<int> &a, const vector<int> &b) { int n = sz(a), m = sz(b); vector<int> p(n + m, 1); for(int i = 0; i < n; i++) p[i] = 0; int ans = inf; do { vector<int> c(n + m); int f = 0, s = 0; for(int i = 0; i < n + m; i++) { if(p[i]) c[i] = b[s++]; else c[i] = a[f++]; } umin(ans, calc(c)); } while(next_permutation(all(p))); return ans; } void solve() { int n, m; cin >> n >> m; vector<int> a(n), b(m); for(auto &i : a) cin >> i; for(auto &i : b) cin >> i; vector<int> ans(n + m + 1); for(int i = 0; i < n; i++) { vector<int> ca; for(int j = i; j < n; j++) { ca.pb(a[j]); for(int l = 0; l < m; l++) { vector<int> cb; for(int r = l; r < m; r++) { cb.pb(b[r]); int curr = f(ca, cb); ans[curr]++; } } } } for(int i = 1; i <= n + m; i++) cout << ans[i] << " "; cout << '\n'; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int ttt = 1; // cin >> ttt; while(ttt--) { solve(); } } |