제출 #1272351

#제출 시각아이디문제언어결과실행 시간메모리
1272351flaming_top1Grudanje (COCI19_grudanje)C++20
70 / 70
78 ms4256 KiB
#include <bits/stdc++.h>

#define SPED                                                                                                           \
    ios_base::sync_with_stdio(false);                                                                                  \
    cin.tie(0);                                                                                                        \
    cout.tie(0);

#define endl "\n"
#define fi first
#define se second
#define lint long long
#define fami signed
#define lore main
#define freefire freopen

const lint INF = 0x1f1f1f1f1f1f1f1f;
const lint NEG = 0xE1E1E1E1E1E1E1E1;

using namespace std;

bool x[100005];
int n, q, bit[100005], idx[30], a[100005], pref[100005];
string s;
vector<int> Query[100005];

void upd(int idx, lint k)
{
    for (; idx <= n; idx += idx & -idx)
        bit[idx] += k;
}

lint get(int idx)
{
    lint res = 0;
    for (; idx; idx -= idx & -idx)
        res += bit[idx];

    return res;
}

lint query(int l, int r)
{
    return get(r) - get(l - 1);
}

bool check(lint mid)
{
    memset(bit, 0, sizeof bit);
    memset(x, 0, sizeof x);
    memset(pref, 0, sizeof pref);
    memset(idx, 0, sizeof idx);
    for (int i = 1; i <= mid; i++)
    {
        x[a[i]] = true;
        pref[a[i]] = 1;
    }
    for (int i = 1; i <= n; i++)
        pref[i] += pref[i - 1];

    for (int i = 1; i <= n; i++)
    {
        if (!x[i])
        {
            if (idx[s[i] - 'a'])
                upd(idx[s[i] - 'a'], -1);
            idx[s[i] - 'a'] = i;
            upd(i, 1);
        }
        for (auto l : Query[i])
        {
            if (query(l, i) == i - l + 1 - (pref[i] - pref[l - 1]))
                continue;
            else
                return false;
        }
    }
    return true;
}

lint binaryu()
{
    lint l = 0, r = n, mid, ans = -1;
    while (l <= r)
    {
        mid = l + r >> 1;
        if (check(mid))
        {
            ans = mid;
            r = mid - 1;
        }
        else
            l = mid + 1;
    }
    return ans;
}

fami lore()
{
    SPED;
    cin >> s >> q;
    n = s.size();
    s = " " + s;
    for (int i = 1; i <= q; i++)
    {
        int l, r;
        cin >> l >> r;
        Query[r].emplace_back(l);
    }
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    cout << binaryu();
}
// Let your soul wander where dreams are born.
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...