CF2059E1 题解
huangrenheluogu · · 题解
相当于,一个长度为
考虑必要条件。考虑如果
- 如果
mat_i-i\lt mat_{i-1}-(i-1) ,i 就不可行了。 - 如果
mat_i-i= mat_{i-1}-(i-1) ,显然没事。 - 如果
mat_i-i\gt mat_{i-1}-(i-1) ,需要中间有点可以分开,就是mat_i\ge R_{bel_i} ,R_{bel_i} 是i 所在的块的右端点。
考虑
考虑构造方案,
因为可以构造方案,说明了上面的步数分析是充要的。
#include<bits/stdc++.h>
#define ls (p << 1)
#define rs (p << 1 | 1)
#define mid (l + r >> 1)
using namespace std;
const int N = 3e5 + 5;
int T, n, m, a[N], b[N], bel[N], pos[N << 1], ans;
int f[N];
inline void chkmax(int &x, int y){
if(x < y) x = y;
}
inline void solve(){
scanf("%d%d", &n, &m);
n *= m;
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++){
scanf("%d", &b[i]);
pos[b[i]] = i;
}
for(int i = 1; i <= n; i++) bel[i] = (i - 1) / m + 1;
bool flg = 0;
for(int i = 1, p; i <= n; i++){
if(!pos[a[i]]){
flg = 1;
}
else if(i > 1 && pos[a[i]] - i < pos[a[i - 1]] - (i - 1)){
flg = 1;
}
else if(i > 1 && pos[a[i - 1]] < m * bel[i - 1] && pos[a[i]] - i > pos[a[i - 1]] - (i - 1)){
flg = 1;
}
if(flg){
p = (bel[i] - 1) * m + 1;
if(p + (p + m - i) > pos[a[p]]){
printf("%d\n", n - p + 1);
return ;
}
else{
printf("%d\n", n - i + 1);
return ;
}
}
}
printf("%d\n", 0);
}
inline void clr(){
for(int i = 1; i <= n * 2; i++){
pos[i] = 0;
}
}
int main(){
// freopen("data.in", "r", stdin);
// freopen("code.out", "w", stdout);
scanf("%d", &T);
while(T--){
solve();
clr();
}
return 0;
}