思路:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define lson p << 1
#define rson p << 1 | 1
#define ll long long
const int maxn = 1e6 + 5, inf = 1e12, maxm = 4e4 + 5, base = 37, d = 1e3;
const int N = 4e3;
const int mod = 1e9 + 7;
// const int mod = 998244353;
// const __int128 mod = 212370440130137957LL;
// int a[4005][4005];
// bool vis[505][505];
// char s[2005][2005];
int n, m;
// int a[maxn];
// int b[maxn];
// string s;
struct Node{
// int val, id;
// bool operator<(const Node &u)const{
// return val < u.val;//!!!!!!!!!!!!!!!!!!
// }
int v, w;
};
int lowbit(int x){
return x & -x;
}
struct Fenwick{
int n;
vector<int> t;
Fenwick(int n) : n(n), t(n + 5, 0){}
void update(int x, int k){
for(int i = x; i <= n; i += lowbit(i)){
t[i] = max(t[i], k);
}
}
int query(int x){
int res = 0;
for(int i = x; i >= 1; i -= lowbit(i)){
res = max(res, t[i]);
}
return res;
}
};
//long long ? maxn ? n? m?
void solve(){
ll res = 0;
int k;
cin >> n >> m;
vector<vector<int>> a(n + 5, vector<int>(m + 5));
vector<vector<int>> c(n + 5, vector<int>(m + 5));
vector<int> b;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> a[i][j];
b.pb(a[i][j]);
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> c[i][j];
}
}
sort(b.begin(), b.end());
b.erase(unique(b.begin(), b.end()), b.end());
vector<vector<array<int, 3>>> pos(b.size() + 5);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
int col = lower_bound(b.begin(), b.end(), a[i][j]) - b.begin() + 1;
pos[col].pb({i, j, c[i][j]});
}
}
for(int i = 1; i <= b.size(); i++){
vector<int> vec;
for(auto [_, y, cnt] : pos[i]){
vec.pb(y);
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
Fenwick fw(vec.size());
for(auto [_, y, cnt] : pos[i]){
y = lower_bound(vec.begin(), vec.end(), y) - vec.begin() + 1;
int now = fw.query(y) + cnt;
fw.update(y, now);
res = max(res, now);
}
}
cout << res << '\n';
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(9);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}