QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#848463 | #9865. Dolls | liyuze | RE | 0ms | 26104kb | C++20 | 5.8kb | 2025-01-08 20:39:51 | 2025-01-08 20:39:52 |
Judging History
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;
}
详细
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...