社区讨论

调试代码(为什么 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 条回复,欢迎继续交流。

正在加载回复...