Автор проблеми: | De3b0o |
Підготовлено: | De3b0o |
Редаговано: | Hasan Saleh (MathModel) |
Рішення
Твердження: Якщо ми виберемо діапазон (l,r) і ціле число для виконання операції, то завжди оптимально, щоб b_l - a_l = b_r - a_r = x.
Доказ: Припустимо, ми вибрали діапазон (l,r) і будь-яке ціле число , якщо b_l - a_l \neq x, ми можемо просто виконати ту ж саму операцію на діапазоні (l+1,r), і остаточна відповідь або залишиться такою ж, або збільшиться на . Те ж саме стосується .
Позначимо p_i як кількість індексів , де j \le i і a_j = b_j. А q_i як кількість індексів , де j < i і b_j - a_j = b_i - a_i.
Тепер для будь-якого діапазону , де b_r - a_r = b_l - a_l, остаточна відповідь масиву після виконання операції на цьому діапазоні буде:
p_n - p_r + p_{l-1} + q_r + 1 - q_l = p_n - p_r + q_r + 1 +(p_{l-1}-q_l)
Отже, якщо ми зафіксуємо , відповідь буде const + (p_{l-1}-q_l), ми можемо просто вибрати , яке дає максимальне значення p_{l-1}-q_l.
Складність \mathcal{O}(n \cdot \log(n)).
#include <bits/stdc++.h>
#define ll long long
#define F first
#define S second
#define in insert
#define pb push_back
#define d3 ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define cans cout << ans << "\n";
#define yes cout << "YES" << "\n";
#define no cout << "NO" << "\n";
#define pll pair<ll, ll>
#define lin cout << "\n";
#define mid ((l + r) / 2)
#define lc (2 * x)
#define rc (2 * x + 1)
#define double long double
using namespace std;
const ll N = 5e5+9;
ll n,ans;
ll a[N],b[N];
ll p[N],q[N];
map<ll,ll> mp;
map<ll,ll> mx;
int main()
{
d3
ll T = 1;
cin >> T;
while(T--)
{
mp.clear();
mx.clear();
ans=0;
cin >> n;
for(int i = 1 ; n>=i ; i++)
cin >> a[i];
for(int i = 1 ; n>=i ; i++)
cin >> b[i];
for(int i = 1 ; n>=i ; i++)
{
p[i]=0;
if(a[i]==b[i])
p[i]=1;
p[i]+=p[i-1];
q[i]=mp[b[i]-a[i]];
mp[b[i]-a[i]]++;
}
for(int i = 1 ; n>=i ; i++)
{
mx[b[i]-a[i]]=max(mx[b[i]-a[i]],p[i-1]-q[i]);
ans=max(ans,q[i]+1+mx[b[i]-a[i]]+p[n]-p[i]);
}
cans
}
}