Потужна задача#12240

Потужна задача (Розбір)

Автор задачі:

Андрій Холод (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;

}