QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#130340 | #3300. Cactus Competition | Lq67122030 | WA | 3ms | 14144kb | C++14 | 3.3kb | 2023-07-23 21:21:37 | 2023-07-23 21:21:41 |
Judging History
answer
#include <bits/stdc++.h>
#define il inline
#define LL long long
using namespace std;
template<typename T> il T Max(const T x,const T y) { return x>y?x:y; }
template<typename T> il T Min(const T x,const T y) { return x<y?x:y; }
const int N=2e5+5,inf=1e9+7;
int n,m,a[N],b[N],pmx[N],pmn[N],smx[N],smn[N],cnt;
LL ans;
struct line{
int l,r,h,num;
il bool operator < (const line &x)const{
return h<x.h;
}
}lin[N*10];
class ST{
private:
int f[N][20],lg2[N];
public:
il void init(int len,int *num){
lg2[0]=-1;
for(int i=1;i<=len;++i) f[i][0]=num[i],lg2[i]=lg2[i>>1]+1;
const int mxn(lg2[n]);
for(int i=1;i<=mxn;++i)
for(int j=1;j+(1<<i)-1<=len;++j)
f[j][i]=Max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
}
il int query(int l,int r){
if(l>r) return -inf;
int d=lg2[r-l+1];
return Max(f[l][d],f[r+(1<<d)-1][d]);
}
}st;
class SGT{
private:
LL sum[N<<2],len[N<<2];
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
il void pushup(int x,int l,int r){
if(sum[x]) len[x]=r-l+1;
else len[x]=len[ls(x)]+len[rs(x)];
}
il void modify(int x,int l,int r,int ll,int rr,int c){
if(r<ll||rr<l) return;
if(ll<=l&&r<=rr) return sum[x]+=c,pushup(x,l,r);
int mid((l+r)>>1) ;
modify(ls(x),l,mid,ll,rr,c),modify(rs(x),mid+1,r,ll,rr,c);
pushup(x,l,r);
}
public:
il void built() { memset(sum,0,sizeof sum),memset(len,0,sizeof len); }
il void modify(int l,int r,int c) { modify(1,1,n,l,r,c); }
il LL al() { return len[1]; }
}T;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",a+i);
for(int i=1;i<=m;++i) scanf("%d",b+i);
st.init(n,a);
pmx[0]=smx[0]=-inf,pmn[m+1]=smn[m+1]=inf;
for(int i=1;i<=m;++i) pmn[i]=Min(pmn[i-1],b[i]),pmx[i]=Max(pmx[i-1],b[i]);
for(int i=m;i;--i) smn[i]=Min(smn[i+1],b[i]),smx[i]=Max(smx[i+1],b[i]);
const int mxb(pmx[m]);
for(int i=1;i<=n;++i) if(a[i]+mxb<0)
lin[++cnt]=(line){1,i,i,1},lin[++cnt]=(line){1,i,n+1,-1};
const int mnb(pmn[m]);
for(int i=1,l=0;i<=n;++i){
if(a[i]+mnb>=0){
if(l) lin[++cnt]=(line){l,i-1,l,1},lin[++cnt]=(line){l,i-1,i,-1},l=0;
}else if(!l) l=i;
}
for(int i=1;i<=n;++i){
int l(1),r(m),ans(0),t;
while(l<=r){
int mid((l+r)>>1);
if(pmx[mid]+a[i]<0) l=mid+1,ans=mid;
else r=mid-1;
}
if(!ans) continue;
l=1,r=i,t=i;
while(l<=r){
int mid((l+r)>>1);
if(pmn[ans]+st.query(mid,i)<0) r=mid-1,t=mid;
else l=mid+1;
}
lin[++cnt]=(line){t,i,t,1},lin[++cnt]=(line){t,i,n+1,-1};
// printf("%d %d\n",i,ans);
}
// puts("");
for(int i=1;i<=n;++i){
int l(1),r(m),ans(m+1),t;
while(l<=r){
int mid((l+r)>>1);
if(smx[mid]+a[i]<0) r=mid-1,ans=mid;
else l=mid+1;
}
if(ans>m) continue;
l=i,r=n,t=i;
while(l<=r){
int mid((l+r)>>1);
if(smn[ans]+st.query(i,mid)<0) l=mid+1,t=mid;
else r=mid-1;
}
lin[++cnt]=(line){1,t,i,1},lin[++cnt]=(line){1,t,t+1,-1};
// printf("%d %d\n",i,ans);
}
// puts("");
for(int i=1;i<=n;++i) lin[++cnt]=(line){i,i,1,1},lin[++cnt]=(line){i,i,i,-1};
sort(lin+1,lin+cnt+1);
for(int i=1;i<cnt;++i){
T.modify(lin[i].l,lin[i].r,lin[i].num);
ans+=T.al()*(lin[i+1].h-lin[i].h);
}
// for(int i=1;i<=cnt;++i) printf("%d %d %d %d\n",lin[i].l,lin[i].r,lin[i].h,lin[i].num);
printf("%lld",1ll*n*n-ans);
return 0;
}
/*
3 3
-1 0 1
1 0 1
*/
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 13852kb
input:
3 3 -1 0 1 -1 0 1
output:
1
result:
ok single line: '1'
Test #2:
score: 0
Accepted
time: 3ms
memory: 13848kb
input:
3 3 -1 0 1 1 0 1
output:
5
result:
ok single line: '5'
Test #3:
score: 0
Accepted
time: 1ms
memory: 14144kb
input:
10 10 145195799 312862766 143966779 -11056226 -503624929 636383890 -182650312 -382759112 -290767690 377894950 -845235881 -418232930 -600566938 -957917357 -181139226 125255273 -175406945 740226783 -750456842 325848662
output:
0
result:
ok single line: '0'
Test #4:
score: -100
Wrong Answer
time: 3ms
memory: 13852kb
input:
10 10 923415743 -503391272 885740174 329644337 -693052351 -53764994 731859967 -834732760 -57751504 151969590 553689579 313784278 -12090771 921222379 -378313551 819586787 -373658045 559813071 671861309 268258615
output:
7
result:
wrong answer 1st lines differ - expected: '13', found: '7'