玄学问题
查看原帖
玄学问题
945607
yurongyi楼主2024/7/12 17:02
#include<bits/stdc++.h>
using namespace std;
long long sum,ans,n,ll,rr,xx,a[200005],cnt=1,c[200005],x[5][2000005];
vector<int> b[200005];
struct node{
	long long val;
	int lf,ri,ls,rs,mx,nd,lz;
}t[4000005];
void build(int l,int r,int x){
    t[x].lf=l,t[x].ri=r;
	if(l>=r){
        t[x].nd=l;
		t[x].val=l;
		t[x].mx=l;
		return;
	}
	int mid=(l+r)/2;
	t[x].ls=++cnt,t[x].rs=++cnt;
	build(l,mid,t[x].ls);
	build(mid+1,r,t[x].rs);
	t[x].val=t[t[x].ls].val+t[t[x].rs].val;
	t[x].mx=r;
	return;
} 
void pd(int x){
    if(!t[x].lz)return;
    t[t[x].ls].lz=t[x].lz;
    t[t[x].ls].val=1ll*t[x].lz*(t[t[x].ls].ri-t[t[x].ls].lf+1);
    t[t[x].ls].mx=t[x].lz;
    t[t[x].rs].lz=t[x].lz;
    t[t[x].rs].val=1ll*t[x].lz*(t[t[x].rs].ri-t[t[x].rs].lf+1);
    t[t[x].rs].mx=t[x].lz;
    t[x].lz=0;
}
void add(int l,int r,int x){
	if(l>rr||r<ll)return;
	if(l>=ll&&r<=rr){
		t[x].val=1ll*xx*(r-l+1);
		t[x].mx=xx;
        t[x].lz=xx;
		return;
	}
    pd(x);
	int mid=(l+r)/2;
	add(l,mid,t[x].ls);
	add(mid+1,r,t[x].rs);
	t[x].val=t[t[x].ls].val+t[t[x].rs].val;
	t[x].mx=max(t[t[x].ls].mx,t[t[x].rs].mx);
	return;
}
long long fid(int l,int r,int x,int y){
	if(l>=r){
		return t[x].nd;
	}
    pd(x);
	int mid=(l+r)/2;
	if(t[t[x].ls].mx<y)return fid(mid+1,r,t[x].rs,y);
	else return fid(l,mid,t[x].ls,y);
}
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;++i){
		scanf("%lld",&a[i]),b[a[i]].push_back(i);
	}
	build(1,n,1);
	for(int i=1;i<=200000;++i){//枚举i的倍数位置 
		x[1][i]=x[2][i]=1e9+7,x[3][i]=x[4][i]=0;
		for(int j=1;j*i<=200000;++j){
//			printf("%d %d\n", i * j, b[i * j].size());
			if(b[j*i].size()){
				for(int k=0;k<b[i*j].size()&&k<2;++k){
					// cout<<k<<' '; 
					if(b[i*j][k]<x[1][i])x[2][i]=x[1][i],x[1][i]=b[i*j][k];
					else if(b[i*j][k]<x[2][i])x[2][i]=b[i*j][k];
				}
				// cout<<endl;
				// printf("###%d\n",k);
				for(int k=b[i*j].size()-1;k>=0&&k>b[i*j].size()-3;--k){
					// cout<<k<<' ';
					// printf("hi!\n");
					if(b[i*j][k]>x[4][i])x[3][i]=x[4][i],x[4][i]=b[i*j][k];
					else if(b[i*j][k]>x[3][i])x[3][i]=b[i*j][k];
				}
				// cout<<endl;
			}
		}
		// if(i>15)continue;
		// for(int j=1;j<=4;++j)cout<<x[j][i]<<' ';
		// cout<<endl;
	}
	for(int i=1;i<=200000;++i)b[i].clear();
    for(long long i=200000;i>=1;--i){
		if(x[3][i]==0)continue;
        // cout<<"________________________"<<i<<endl;
        // for(int j=1;j<=20;++j){
        //     cout<<t[j].lf<<' '<<t[j].ri<<' '<<t[j].val<<' '<<t[j].mx<<' '<<t[j].lz<<endl;
        // }
		sum=t[1].val;
		xx=n+1,ll=x[2][i]+1,rr=n;
		add(1,n,1);
		long long k=fid(1,n,1,x[3][i]);
        // cout<<"K="<<k<<endl;
		ll=1,rr=min(k-1,x[1][i]),xx=x[3][i];
        // cout<<"LLRR"<<ll<<' '<<rr<<' '<<x[3][i]<<endl;
		add(1,n,1);
		k=fid(1,n,1,x[4][i]);
        // cout<<"K="<<k<<endl;
		rr=min(x[2][i],k-1);
		ll=x[1][i]+1;
		xx=x[4][i];
		add(1,n,1);
		sum-=t[1].val;
        // cout<<i<<' '<<sum<<endl;
		ans-=sum*i; 
	}
    // cout<<t[1].val<<endl;
	// ans+=t[1].val;
	cout<<ans;
	return 0;
}

为什么把k>b[i*j].size()-3改成k+3>b[i*j].size()就能过?

2024/7/12 17:02
加载中...