QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#848463#9865. DollsliyuzeRE 0ms26104kbC++205.8kb2025-01-08 20:39:512025-01-08 20:39:52

Judging History

你现在查看的是最新测评结果

  • [2025-01-08 20:39:52]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:26104kb
  • [2025-01-08 20:39:51]
  • 提交

answer

#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define fr(i,a,b) for(int i=(a);i<=(b);++i)
#define fd(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
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=1e6;
int T;
int n,q;
int a[N+5];
int p[N+5];
int f[N+5];
int cnt1,cnt2;
int stk1[N+5];
int stk2[N+5];
int mn[N+5][20];
int mx[N+5][20];
int Log[N+5];
int qrymin(int l,int r)
{
	int Lg=Log[r-l+1];
	return min(mn[l][Lg],mn[r-(1<<Lg)+1][Lg]);
}
int qrymax(int l,int r)
{
	int Lg=Log[r-l+1];
	return max(mx[l][Lg],mx[r-(1<<Lg)+1][Lg]);
}
int tag[4*N+5];
int minv[4*N+5];
int minp[4*N+5];
int maxp[4*N+5];
void pushdown(int p)
{
	if(!tag[p]) return;
	int ls=2*p,rs=2*p+1;
	tag[ls]+=tag[p];
	minv[ls]+=tag[p];
	tag[rs]+=tag[p];
	minv[rs]+=tag[p];
	tag[p]=0;
}
void pushup(int p)
{
	int ls=2*p,rs=2*p+1;
	if(minv[ls]<=minv[rs])
	{
		minv[p]=minv[ls];
		minp[p]=minp[ls];
		if(minv[ls]==minv[rs]) maxp[p]=maxp[rs];
		else maxp[p]=maxp[ls];
	}
	else
	{
		minv[p]=minv[rs];
		minp[p]=minp[rs];
		maxp[p]=maxp[rs];
	}
}
void build(int l,int r,int p)
{
	tag[p]=0;
	if(l==r)
	{
		minv[p]=0;
		minp[p]=l;
		maxp[p]=l;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,2*p);
	build(mid+1,r,2*p+1);
	pushup(p);
}
void modify(int l,int r,int x,int y,int p,int v)
{
	if(x<=l&&r<=y)
	{
		tag[p]+=v;
		minv[p]+=v;
		return;
	}
	pushdown(p);
	int mid=(l+r)>>1;
	if(mid>=x) modify(l,mid,x,y,2*p,v);
	if(mid<y) modify(mid+1,r,x,y,2*p+1,v);
	pushup(p);
}
pair<int,pair<int,int>>query(int l,int r,int x,int y,int p)
{
	if(x<=l&&r<=y)
	{
		return {minv[p],{minp[p],maxp[p]}};
	}
	pushdown(p);
	int mid=(l+r)>>1;
	if(mid>=x&&mid<y)
	{
		auto resl=query(l,mid,x,y,2*p);
		auto resr=query(mid+1,r,x,y,2*p+1);
		if(resl.first<=resr.first)
		{
			if(resl.first==resr.first) return {resl.first,{resl.second.first,resr.second.second}};
			return resl;
		}
		else return resr;
	}
	else if(mid>=x) return query(l,mid,x,y,2*p);
	else return query(mid+1,r,x,y,2*p+1);
}
int fa[N+5][20];
int main()
{
	io>>T;
	while(T--)
	{
		io>>n;
		fr(i,1,n) io>>a[i];
		fr(i,1,n) mn[i][0]=a[i];
		fr(i,1,n) mx[i][0]=a[i];
		fr(i,2,n) Log[i]=Log[i/2]+1;
		fr(k,1,19)
		{
			for(int i=1;i+(1<<k)-1<=n;++i)
			{
				mn[i][k]=min(mn[i][k-1],mn[i+(1<<(k-1))][k-1]);
				mx[i][k]=max(mx[i][k-1],mx[i+(1<<(k-1))][k-1]);
			}
		}
		build(1,n,1);
		cnt1=cnt2=0;
		p[n]=n;
		fd(i,n-1,1)
		{
			if(a[i]<a[i+1])
			{
				int l=i+1,r=n,res=0;
				while(l<=r)
				{
					int mid=(l+r)>>1;
					if(qrymin(i+1,mid)>a[i]) res=mid,l=mid+1;
					else r=mid-1;
				}
				while(cnt2&&stk2[cnt2]<res)
				{
					modify(1,n,stk2[cnt2]+1,f[stk2[cnt2]],1,-1);
					f[stk2[cnt2]]=0;
					--cnt2;
				}
				if(cnt2&&stk2[cnt2]==res)
				{
					int now=res;
					l=now+1,r=n,res=0;
					while(l<=r)
					{
						int mid=(l+r)>>1;
						if(a[i]>qrymax(now+1,mid)) res=mid,l=mid+1;
						else r=mid-1;
					}
					modify(1,n,now+1,f[now],1,-1);
					--cnt2;
					f[now]=res;
					if(res)
					{
						modify(1,n,now+1,f[now],1,1);
						stk2[++cnt2]=now;
					}
				}
				l=i+1,r=n,res=0;
				while(l<=r)
				{
					int mid=(l+r)>>1;
					if(a[i]<qrymin(i+1,mid)) res=mid,l=mid+1;
					else r=mid-1;
				}
				f[i]=res;
				if(res)
				{
					modify(1,n,i+1,f[i],1,1);
					stk1[++cnt1]=i;
				}
			}
			else
			{
				int l=i+1,r=n,res=0;
				while(l<=r)
				{
					int mid=(l+r)>>1;
					if(qrymax(i+1,mid)<a[i]) res=mid,l=mid+1;
					else r=mid-1;
				}
				while(cnt1&&stk1[cnt1]<res)
				{
					modify(1,n,stk1[cnt1]+1,f[stk1[cnt1]],1,-1);
					f[stk1[cnt1]]=0;
					--cnt1;
				}
				if(cnt1&&stk1[cnt1]==res)
				{
					int now=res;
					l=now+1,r=n,res=0;
					while(l<=r)
					{
						int mid=(l+r)>>1;
						if(a[i]<qrymin(now+1,mid)) res=mid,l=mid+1;
						else r=mid-1;
					}
					modify(1,n,now+1,f[now],1,-1);
					--cnt1;
					f[now]=res;
					if(res)
					{
						modify(1,n,now+1,f[now],1,1);
						stk1[++cnt1]=now;
					}
				}
				l=i+1,r=n,res=0;
				while(l<=r)
				{
					int mid=(l+r)>>1;
					if(a[i]>qrymax(i+1,mid)) res=mid,l=mid+1;
					else r=mid-1;
				}
				f[i]=res;
				if(res)
				{
					modify(1,n,i+1,f[i],1,1);
					stk2[++cnt2]=i;
				}
			}
			auto res=query(1,n,i+1,n,1);
			if(res.first>0) p[i]=p[i+1];
			else if(res.first==0)
			{
				assert(res.second.second==n);
				p[i]=min(p[i+1],res.second.first-1);
			}
		}
		fa[n+1][0]=n+1;
		fr(i,1,n) fa[i][0]=p[i]+1;
		fr(k,1,19)
		{
			fr(i,1,n+1)
			{
				fa[i][k]=fa[fa[i][k-1]][k-1];
			}
		}
		int l=1,r=n,x;
		int ans=0;
		x=l;
		fd(k,19,0)
		{
			if(fa[x][k]<=r)
			{
				x=fa[x][k];
				ans+=1<<k;
			}
		}
		++ans;
		ans=r-l-ans+1;
		io<<ans<<'\n';
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 26104kb

input:

8
4
2 1 4 3
4
1 4 2 3
4
3 1 4 2
5
1 3 5 2 4
5
1 4 2 5 3
5
2 5 3 1 4
6
1 3 6 5 2 4
6
2 5 1 3 6 4

output:

3
3
2
3
3
3
4
4

result:

ok 8 numbers

Test #2:

score: -100
Runtime Error

input:

5913
1
1
2
1 2
2
2 1
3
1 2 3
3
1 3 2
3
2 1 3
3
2 3 1
3
3 1 2
3
3 2 1
4
1 2 3 4
4
1 2 4 3
4
1 3 2 4
4
1 3 4 2
4
1 4 2 3
4
1 4 3 2
4
2 1 3 4
4
2 1 4 3
4
2 3 1 4
4
2 3 4 1
4
2 4 1 3
4
2 4 3 1
4
3 1 2 4
4
3 1 4 2
4
3 2 1 4
4
3 2 4 1
4
3 4 1 2
4
3 4 2 1
4
4 1 2 3
4
4 1 3 2
4
4 2 1 3
4
4 2 3 1
4
4 3 1 2
4...

output:


result: