QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1434#847935#9865. DollsKnownError_KnownError_Success!2025-01-08 13:49:272025-01-08 13:49:28

详细

Extra Test:

Time Limit Exceeded

input:

1
100000
50000 50001 49999 50002 49998 50003 49997 50004 49996 50005 49995 50006 49994 50007 49993 50008 49992 50009 49991 50010 49990 50011 49989 50012 49988 50013 49987 50014 49986 50015 49985 50016 49984 50017 49983 50018 49982 50019 49981 50020 49980 50021 49979 50022 49978 50023 49977 50024 499...

output:


result:


ID题目提交者结果用时内存语言文件大小提交时间测评时间
#847935#9865. DollsKnownError_TL 28ms20172kbC++142.9kb2025-01-08 13:40:302025-01-08 13:53:47

answer

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;

using ui = unsigned;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define per(i,l,r) for(int i=(l);i>=(r);--i)
#define repn(i,n) for(int i=0;i<(n);++i)
#define sizc(x) ((int)(x).size())
#define allc(x) (x).begin(),(x).end()
#define fir first
#define sec second

class IO {
    char ibuf[1 << 16], obuf[1 << 16], *ipl = ibuf, *ipr = ibuf, *op = obuf;
    public:
    ~IO() { write(); }
    void read() { if (ipl == ipr) ipr = (ipl = ibuf) + fread(ibuf, 1, 1 << 15, stdin); }
    void write() { fwrite(obuf, 1, op - obuf, stdout), op = obuf; }
    char getchar() { return (read(), ipl != ipr) ? *ipl++ : EOF; }
    void putchar(char c) { *op++ = c; if (op - obuf > (1 << 15)) write(); }
    template <typename V> IO& operator >> (V& v) {
        int s = 1; char c = getchar(); v = 0;
        for (; !isdigit(c); c = getchar()) if (c == '-') s = -s;
        for (; isdigit(c); c = getchar()) v = (v << 1) + (v << 3) + (c ^ 48);
        return v *= s, *this;
    }
    IO& operator << (char c) { return putchar(c), *this; }
    template <typename V> IO& operator << (V v) {
        if (!v) putchar('0'); if(v < 0) putchar('-'), v = -v;
        char stk[100], *top = stk;
        for (; v; v /= 10) *++top = v % 10 + '0';
        while (top != stk) putchar(*top--); return *this;
    }
} io;

constexpr int N = 1e5+5;

int n;
int a[N];

int mn[20][N],mx[20][N];
int qmn(int l,int r){
    int k=__lg(r-l+1);
    return min(mn[k][l],mn[k][r-(1<<k)+1]);
}
int qmx(int l,int r){
    int k=__lg(r-l+1);
    return max(mx[k][l],mx[k][r-(1<<k)+1]);
}

int f[N];

void solve(){
    io>>n;rep(i,1,n)io>>a[i];
    rep(i,1,n)mn[0][i]=mx[0][i]=a[i];
    rep(j,1,19)rep(i,1,n-(1<<j)+1){
        mn[j][i]=min(mn[j-1][i],mn[j-1][i+(1<<j-1)]);
        mx[j][i]=max(mx[j-1][i],mx[j-1][i+(1<<j-1)]);
    }
    per(i,n,1){
        f[i]=i;
        while(f[i]<n){
            int l=qmn(i,f[i]),r=qmx(i,f[i]);
            int p=f[i]+1;
            if(l<=a[p]&&a[p]<=r)break;
            if(a[p]<l){
                if(qmx(p,f[p])<l){
                    f[i]=f[p];
                    break;
                }
                int t=p;
                per(j,19,0)if(t+(1<<j)<=f[p]&&mx[j][t]<l)t+=1<<j;
                f[i]=t-1;
            }
            else{
                if(qmn(p,f[p])>r){
                    f[i]=f[p];
                    break;
                }
                int t=p;
                per(j,19,0)if(t+(1<<j)<=f[p]&&mn[j][t]>r)t+=1<<j;
                f[i]=t-1;
            }
        }
    }
    int ans=n-1,p=1;
    while(f[p]<n)p=f[p]+1,--ans;
    cout<<ans<<'\n';
}

signed main(){
    // freopen("doll.in","r",stdin);
    // freopen("doll.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;io>>T;
    while(T--)solve();
}