萌新求助卡常
查看原帖
萌新求助卡常
332022
ChthollyMeow楼主2022/6/24 15:13

TLE#2,3,4,其中 #2 是 3.10s3.10s 左右,#3,4 都是 3.20s3.20s 之外

话说这题以前好像时限是 5s5s 啊。。为啥要调成 3s3s

#include<bits/stdc++.h>

#define ll long long

using namespace std;

inline char nc(){
	static char buf[100000],*p1=buf,*p2=buf;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
	char ch=nc();
	int sum=0;
	while(!(ch>='0'&&ch<='9'))ch=nc();
	while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
	return sum;
}
inline void out(ll a){
    if(a>=10)out(a/10);
    putchar(a%10+'0');
}

const int MN=5e5+5;

int n,m,a[MN];

struct Query{int l,r,id;ll ans;}q[MN];
int bl[MN],len,pre[MN],M,cnt[MN],sum[MN],B;
ll ans[MN];

vector<int>d[MN];
bool vis[MN];

struct Node{
	int l,r,id;
	Node(int L,int R,int I):l(L),r(R),id(I){}
	Node(){}
};
vector<Node>vec[MN];

signed main(void){

#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
#endif	

	n=read(),m=read();len=1000;
	for(int i=1;i<=n;i++){
		a[i]=read(),M=max(M,a[i]);
		if(vis[a[i]])continue;
		for(int x=1;x*x<=a[i];x++){
			if(a[i]%x==0){
				d[a[i]].emplace_back(x);
				if(x*x!=a[i])d[a[i]].emplace_back(a[i]/x);
			}
		}
		vis[a[i]]=1;
	}
	B=25;

	for(int i=1;i<=n;i++){
		pre[i]+=sum[a[i]];
		for(int x:d[a[i]])sum[x]++,pre[i]+=cnt[x];
		cnt[a[i]]++;pre[i]+=pre[i-1];
		// cout<<pre[i]-pre[i-1]<<' ';
	}//puts("");
	for(int i=1;i<=n;i++)bl[i]=(i-1)/len+1;

	for(int i=1;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].id=i;
	sort(q+1,q+m+1,[](const Query &x,const Query &y){
		if(bl[x.l]!=bl[y.l])return bl[x.l]<bl[y.l];
		if(bl[x.l]&1)return x.r<y.r;
		else return x.r>y.r;
	});

	int l=1,r=0;
	for(int i=1;i<=m;i++){
		int ql=q[i].l,qr=q[i].r;
		// cout<<l<<" "<<r<<" -> "<<ql<<" "<<qr<<endl;
		if(l>ql)vec[r].emplace_back(Node(ql,l-1,i)),q[i].ans-=(pre[l-1]-pre[ql-1]+l-ql),l=ql; //+ [ql,l-1]->[l,r]
		if(r<qr)vec[l-1].emplace_back(Node(r+1,qr,-i)),q[i].ans+=(pre[qr]-pre[r]+qr-r),r=qr; //+ [r+1,qr]->[l,r]
		if(l<ql)vec[r].emplace_back(Node(l,ql-1,-i)),q[i].ans+=(pre[ql-1]-pre[l-1]+ql-l),l=ql; //- [l,ql-1]->[l,r]
		if(r>qr)vec[l-1].emplace_back(Node(qr+1,r,i)),q[i].ans-=(pre[r]-pre[qr]+r-qr),r=qr; //- [qr+1,r]->[l,r]
	}

	//solve big
	memset(sum,0,sizeof(sum));
	for(int i=1;i<=n;i++){
		for(int x:d[a[i]])sum[x]++;
		if(a[i]>B)for(int x=a[i];x<=M;x+=a[i])sum[x]++;
		for(auto t:vec[i]){
			for(int x=t.l;x<=t.r;x++){
				if(t.id>0)q[t.id].ans+=1ll*sum[a[x]];
				else q[-t.id].ans-=1ll*sum[a[x]];
			}
		}
	}

	//solve small
	memset(sum,0,sizeof(sum));
	for(int x=1;x<=B;x++){
		if(!vis[x])continue;
		int num=0;
		for(int i=1;i<=n;i++)sum[i]=(a[i]%x==0)+sum[i-1];
		for(int i=1;i<=n;i++){
			num+=(a[i]==x);
			for(auto t:vec[i]){
				if(t.id>0)q[t.id].ans+=(1ll*(sum[t.r]-sum[t.l-1]))*(1ll*num);
				else q[-t.id].ans-=(1ll*(sum[t.r]-sum[t.l-1]))*(1ll*num);
			}
		}
	}

	for(int i=1;i<=m;i++)q[i].ans+=q[i-1].ans;
	for(int i=1;i<=m;i++)ans[q[i].id]=q[i].ans;
	for(int i=1;i<=m;i++)out(ans[i]),putchar('\n');

	return 0;
}
2022/6/24 15:13
加载中...