社区讨论
调试代码(为什么 CE)
灌水区参与者 3已保存回复 15
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 15 条
- 当前快照
- 1 份
- 快照标识符
- @m3mwbb5t
- 此快照首次捕获于
- 2024/11/18 18:41 去年
- 此快照最后确认于
- 2025/11/04 23:31 4 个月前
代码:
CPP#include<bits/stdc++.h>
#define x0 x_0
#define x1 x_1
#define y0 y_0
#define y1 y_1
#define yn y_n
#define j0 j_0
#define j1 j_1
#define k0 k_0
#define k1 k_1
#define d0 d_0
#define d1 d_1
#define LL long long
#define LD long double
using namespace std;
int n,a[5000010],b[2500010],bcnt,c[2500010],ccnt;
LL Pow[40];
int Log[5000010],cun[5000010];
template<const int size> struct RMQ{
int n,a[size+10],bsz,mn[140010][40];
int mnpos[140010][40],bel[size+10],pos[size+10];
int pre[size+10],sub[size+10],subpos[size+10],prepos[size+10];
LL F[size+10];
void build_st(){
int cnt=0,id=1;
pos[0]=-1;
memset(mn,63,sizeof(mn));
for(int i=1;i<=n;++i){
if(mn[id][0]>a[i]) mn[id][0]=a[i],mnpos[id][0]=i;
bel[i]=id;
if(bel[i-1]^bel[i]) pos[i]=0;
else pos[i]=pos[i-1]+1;
++cnt;
if(cnt==bsz) cnt=0,++id;
}
if(n%bsz==0) --id;
for(int j=1;j<=Log[id];++j){
for(int i=1;i+(1<<j)-1<=id;++i){
if(mn[i][j-1]<=mn[i+(1<<j-1)][j-1]){
mnpos[i][j]=mnpos[i][j-1];
mn[i][j]=mn[i][j-1];
}else{
mnpos[i][j]=mnpos[i+(1<<j-1)][j-1];
mn[i][j]=mn[i+(1<<j-1)][j-1];
}
}
}
return ;
}
void build_subpre(){
for(int i=1;i<=n;++i){
if(bel[i]^bel[i-1]) pre[i]=a[i],prepos[i]=i;
else{
if(pre[i-1]<=a[i]) pre[i]=pre[i-1],prepos[i]=prepos[i-1];
else pre[i]=a[i],prepos[i]=i;
}
}
for(int i=n;i>=1;--i){
if(bel[i]^bel[i+1]) sub[i]=a[i],subpos[i]=i;
else{
if(sub[i+1]<=a[i]) sub[i]=sub[i+1],subpos[i]=subpos[i+1];
else sub[i]=a[i],subpos[i]=i;
}
}
}
void build_block(){
int tp=0;
for(int i=1;i<=n;++i){
if(bel[i]^bel[i-1]) tp=0;
else F[i]=F[i-1];
while(tp>0 && a[cun[tp]]>=a[i]) F[i]&=~(1<<pos[cun[tp--]]);
cun[++tp]=i;
F[i]|=(1<<pos[i]);
}
return ;
}
void Init(int b[],int N){
n=N;
for(int i=1;i<=n;++i) a[i]=b[i];
bsz=(LD)1.5*log2(n);
build_st();
build_subpre();
build_block();
return ;
}
int query_minpos(int l,int r){
int bl=bel[l],br=bel[r];
if(bl^br){
if(br-bl>1){
int ret=0;
int p=Log[br-bl-1];
if(mn[bl+1][p]<=mn[br-Pow[p]][p]) ret=mnpos[bl+1][p];
else ret=mnpos[br-Pow[p]][p];
if(sub[l]<a[ret]) ret=subpos[l];
if(pre[r]<a[ret]) ret=prepos[r];
return ret;
}
if(sub[l]<=pre[r]) return subpos[l];
return prepos[r];
}else{
return l+__builtin_ctz(F[r]>>pos[l]);
}
}
};
void Init(){
Pow[0]=1;
for(int i=1;i<40;++i) Pow[i]=(Pow[i-1]<<1);
for(int i=2;i<=5000009;++i) Log[i]=Log[i>>1]+1;
return ;
}
RMQ<5000000> qmna;
RMQ<2500000> qmnb,qmnc;
template<typename Name> Name min(Name a,Name b,Name c) {return min(a,min(b,c));}
struct node{
int r,data;
bool operator < (const node &o)const{
return (r!=o.r ? r<o.r : data<o.data);
}
};
map<node,int> mp2[5000010],mp3[5000010];
int f2(int l,int r,int data,bool f){
if(l>r) return 0;
if(l==r) return (b[l]>data);
if(mp2[l].count({r,data})) return mp2[l][{r,data}];
int x=qmnb::query_minpos(l,r);
x=posb[x];
if(b[x]==data){
int ans=0;
ans+=f2(l,x-1,data,f);
ans+=f2(x+1,r,data,f);
if(f) return mp2[l][{r,data}]=ans;
else return ans;
}
int ans1=r-l+1;
int ans2=f2(l,x-1,b[x],f)+((b[x]-data)<<1)+f2(x+1,r,b[x],f);
if(f) return mp2[l][{r,data}]=min(ans1,ans2);
else return min(ans1,ans2);
}
int f3(int l,int r,int data,bool f){
if(l>r) return 0;
if(l==r) return (c[l]>data);
if(mp3[l].count({r,data})) return mp3[l][{r,data}];
int x=qmnc::query_minpos(l,r);
x=posc[x];
if(c[x]==data){
int ans=0;
ans+=f3(l,x-1,data,f);
ans+=f3(x+1,r,data,f);
if(f) return mp3[l][{r,data}]=ans;
else return ans;
}
int ans1=r-l+1;
int ans2=f3(l,x-1,c[x],f)+((c[x]-data)<<1)+f3(x+1,r,c[x],f);
if(f) return mp3[l][{r,data}]=min(ans1,ans2);
else return min(ans1,ans2);
}
int f1(int l,int r,int data){
if(l>r) return 0;
if(l==r) return (a[l]>data);
int x=qmna::query_minpos(l,r);
x=posa[x];
if(a[x]==data){
int ans=0;
ans+=f1(l,x-1,data);
ans+=f1(x+1,r,data);
return ans;
}
int Ust=(l>>1)+1,Ued=(r+1>>1);
int Vst=(l-1>>1)+1,Ved=(r>>1);
int ans1=r-l+1;
int ans2=f1(l,x-1,a[x])+(a[x]-data)*3+f1(x+1,r,a[x]);
int ans3=f2(Ust,Ued,data,0)+f3(Vst,Ved,data,0);
return min(ans1,ans2,ans3);
}
int main(){
// freopen("T.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
rmqqp::Init();
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;i+=2) b[++bcnt]=a[i];
for(int i=2;i<=n;i+=2) c[++ccnt]=a[i];
qmna::Init(a,n);
qmnb::Init(b,bcnt);
qmnc::Init(c,ccnt);
int xxxxx=f2(1,bcnt,0,1);
xxxxx=f3(1,ccnt,0,1);
cout<<f1(1,n,0)<<"\n";
return 0;
}
回复
共 15 条回复,欢迎继续交流。
正在加载回复...