RT,应该是递归爆栈了……
没检查出来……
板子是过了P3372的……
#include<bits/stdc++.h>
#define lson(o) o<<1
#define rson(o) o<<1|1
using namespace std;
const int MAXN=1e7+5;
long long n,m,a[MAXN];
long long val[MAXN<<2],tag[MAXN<<2];
inline void push_up(long long o){
val[o]=val[lson(o)]+val[rson(o)];
}
void build(long long o,long long l,long long r){
tag[o]=0;
if(l==r){
val[o]=l;//建值(different)
return;
}
long long mid=(l+r)>>1;
build(lson(o),l,mid);
build(rson(o),mid+1,r);
push_up(o);
}
inline void give(long long o,long long l,long long r,long long k){
tag[o]=tag[o]+k;
val[o]=val[o]+k*(r-l+1);
}
inline void push_down(long long o,long long l,long long r){
long long mid=(l+r)>>1;
give(lson(o),l,mid,tag[o]);
give(rson(o),mid+1,r,tag[o]);
tag[o]=0;
}
long long query(long long o,long long l,long long r,long long ql,long long qr){
long long res=0;
if(ql<=l&&r<=qr){
return val[o];
}
long long mid=(l+r)>>1;
push_down(o,l,r);
if(ql<=mid){
res+=query(lson(o),l,mid,ql,qr);
}
if(qr>mid){
res+=query(rson(o),mid+1,r,ql,qr);
}
return res;
}
long long dfs(long long l,long long r,long long h){
if(l>r){
return 0;
}
long long mid=query(1,1,n,l,r);
long long x__=a[mid]-h+dfs(l,mid-1,a[mid])+dfs(mid+1,r,a[mid]);
long long y__=r-l+1;
return min(x__,y__);
}
int main(){
cin>>n;
for(register long long i=1;i<=n;++i){
cin>>a[i];
}
build(1,1,n);
cout<<dfs(1,n,0);
return 0;
}
dalao帮忙看看……(蒟蒻被教练拉回寝室了,等会再看看有木有大佬帮忙……)