Автор задачі: | Андрій Холод (Connect) |
Підготовлено: | Андрій Холод (Connect) |
Розбір: | Андрій Холод (Connect) |
Рішення
Для початку помітимо що якщо ми змогли зробити a_i b_i в якійсь позиції , то ми зможемо зробити a_j b_j для всіх . Отже задача зводиться до находження найбільшого для якого ми зможемо зробити a_i b_i.
Також помітимо що при застосуванні операцій першого та другого типу для якогось індексу , a_{i-1} i-1 стає рівним a_i . Так само для масиву . Оскільки (a_i ) ( ) a_i . А при застосуванні операції третього типу для всіх які більші за індекс який ми видаляємо значення a_j та b_j зменшиться на одиницю.
Отже, задача звелась до визначення для кожного на суфіксі [i+1 , ] масиву чи існує індекс для якого виконується a_i b_j . Також на суфіксі [i+2 , ] масиву чи існує індекс для якого виконується a_i b_j . Аналогічно відносно масиву .
Це можна зробити за допомогою set чи map.
Асимптотика такого рішення ( ()).
#include <bits/stdc++.h>
// fast_pragmas
//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize ("unroll-loops")
//#pragma GCC target("avx,avx2,tune=native")
// fast_pragmas ended
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
using namespace std;
#define ull unsigned long long
#define ll long long
#define ld long double
#define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define endl '\n'
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
#define pb push_back
#define ln log
#define lg log10
#define log log2
#define here cout<<"HERE"<<endl
const ll clasik = 2e5+7;
const ll mln = 1e6+7;
const ll mod = 1e9+7;
//const ll mod = 998244353;
const ll block_size = 450;
const ll INF = 1e17;
ll df[clasik];
ll a[clasik] , b[clasik];
void solve() {
ll n;
cin>>n;
for (int i = 1 ; i<=n ; i++) {
cin>>a[i];
a[i] = a[i] - i;
}
for (int i = 1 ; i<=n ; i++) {
cin>>b[i];
b[i] = b[i] - i;
}
set<ll> st1 , st2;
for (int i = n ; i>=1 ; i--) {
if (a[i] == b[i]) {
cout<<i<<endl;
return;
}
if (i == n) {
continue;
}
if (st2.count(a[i]) || a[i] == b[i+1]) {
cout<<i<<endl;
return;
}
if (st1.count(b[i]) || b[i] == a[i+1]) {
cout<<i<<endl;
return;
}
if (st2.count(a[i] - 1)) {
cout<<i<<endl;
return;
}
if (st1.count(b[i] - 1)) {
cout<<i<<endl;
return;
}
st1.insert(a[i+1]);
st2.insert(b[i+1]);
}
cout<<0<<endl;
}
signed main() {
//freopen("test.txt" , "r" , stdin);
speed;
int test;
test=1;
//precalc();
//cin>>test;
for (int tt=1 ;tt<=test ; tt++) {
solve();
}
return 0;
}