求助
查看原帖
求助
275090
Albet楼主2022/8/9 23:18

TlE#4

TLE是什么原因呀?

写的是整体二分 复杂度应该是O(nloglogn)吧

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define ls (x << 1)
#define rs (x << 1 | 1)
#define mid ((l + r) >> 1)
using namespace std;
typedef long long ll;
ll read()
{
    char c = 0;
    ll o = 1, x = 0;
    while (c < '0' or '9' < c)
    {
        if (c == '-')
            o = -o;
        c = getchar();
    }
    while ('0' <= c and c <= '9')
    {
        x *= 10;
        x += c - '0';
        c = getchar();
    }
    return x * o;
}
void write(ll x)
{
    if (x < 0)
    {
        putchar('-');
        x = -x;
    }
    ll sck[20], sctop = 0;
    do
    {
        sck[sctop++] = x % 10;
        x /= 10;
    } while (x);
    for (ll i = sctop - 1; i >= 0; --i)
        putchar(sck[i] + '0');
    puts("");
}
ll const maxn = 1e5 + 7, maxt = 2e6 + 7;
ll ln[maxn << 2], mn[maxn << 2], rn[maxn << 2], mmax, rmax;
void push_up(ll x, ll l, ll r)
{
    if (mn[ls] == mid - l + 1)
        ln[x] = mn[ls] + ln[rs];
    else
        ln[x] = ln[ls];
    if (mn[rs] == r - mid)
        rn[x] = mn[rs] + rn[ls];
    else
        rn[x] = rn[rs];
    mn[x] = max(max(mn[ls], mn[rs]), rn[ls] + ln[rs]);
}
void mod(ll x, ll l, ll r, ll k, ll val)
{
    if (k < l or r < k)
        return;
    if (l == r)
    {
        ln[x] = mn[x] = rn[x] = val;
        return;
    }
    mod(ls, l, mid, k, val);
    mod(rs, mid + 1, r, k, val);
    push_up(x, l, r);
}
void qry(ll x, ll l, ll r, ll L, ll R)
{
    if (R < l or r < L)
        return;
    if (L <= l and r <= R)
    {
        mmax = max(mmax, mn[x]);
        mmax = max(mmax, rmax + ln[x]);
        if (mn[x] == r - l + 1)
            rmax += mn[x];
        else
            rmax = rn[x];
        return;
    }
    qry(ls, l, mid, L, R);
    qry(rs, mid + 1, r, L, R);
}
ll n, m;
ll ans[maxn];
struct num
{
    ll x, v;
} a[maxn];
struct qq
{
    ll l, r, k, p;
} q[maxn];
bool cmp(num a, num b)
{
    return a.v < b.v;
}
ll T[maxt];
void deal(ll l, ll r, ll ql, ll qr, ll tot)
{
    // prllf("%d %d %d %d\n", l, r, ql, qr);
    if (ql > qr or l > r)
        return;
    for (ll i = mid; i <= n; ++i)
        mod(1, 1, n, a[i].x, 1);
    ll *u = new ll[maxn];
    ll ut = 0;
    ll *v = new ll[maxn];
    ll vt = 0;
    for (ll i = ql; i <= qr; ++i)
    {
        ll j = T[i];
        mmax = rmax = 0;
        qry(1, 1, n, q[j].l, q[j].r);
        // write(mmax);
        if (mmax >= q[j].k)
        {
            ans[q[j].p] = a[mid].v;
            u[++ut] = j;
        }
        else
            v[++vt] = j;
    }
    for (ll i = mid; i <= n; ++i)
        mod(1, 1, n, a[i].x, 0);
    ll fl = tot + 1, fr = tot;
    for (ll i = 1; i <= vt; ++i)
        T[++fr] = v[i];
    ll sl = fr + 1, sr = fr;
    for (ll i = 1; i <= ut; ++i)
        T[++sr] = u[i];
    // prllf("%d %d %d %d\n", fl, fr, sl, sr);
    delete[] u;
    delete[] v;
    deal(l, mid - 1, fl, fr, sr);
    deal(mid + 1, r, sl, sr, sr);
}
int main()
{
    n = read();
    for (ll i = 1; i <= n; ++i)
    {
        a[i].v = read();
        a[i].x = i;
    }
    sort(a + 1, a + n + 1, cmp);
    m = read();
    for (ll i = 1; i <= m; ++i)
    {
        q[i].l = read();
        q[i].r = read();
        q[i].k = read();
        q[i].p = i;
        T[i] = i;
    }
    deal(1, n, 1, m, m);
    for (ll i = 1; i <= m; ++i)
        write(ans[i]);
    return 0;
}
/*
 */
2022/8/9 23:18
加载中...