所以是我做法有问题吗
查看原帖
所以是我做法有问题吗
501028
spider_oyster楼主2023/12/26 12:22

已经交了 4 发全 TLE 的代码了,本地烂机子差不多跑 3.4 s。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int N=5e5+5,B=710;
ll ans[N],ans2[N],s[N];
int n,m,V,a[N],c[N],t[N],num[N],pd[N];
struct node{int l,r,w,id;} q[N];
vector<int> p[N];
vector<node> v[N];

char buf[1<<15],*p1=buf,*p2=buf;
#define nc() (p1==p2&&(p2=buf+fread(p1=buf,1,1<<15,stdin),p1==p2)?-1:*p1++)
inline int rd()
{
    int x=0;char c=nc();
    for(;!isdigit(c);c=nc());
    for(; isdigit(c);c=nc()) x=(x<<3)+(x<<1)+(c^48);
    return x;
}

int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    n=rd(),m=rd();
    clock_t st=clock(),ed;
    for(int i=1;i<=n;i++) V=max(V,a[i]=rd()),num[i]=num[i-1]+(a[i]>=B);
    for(int i=1;i<=m;i++) q[i]={rd(),rd(),0,i},ans2[i]=num[q[i].r]-num[q[i].l-1];
    for(int i=1;i<=V;i++) for(int j=i;j<=V;j+=i) p[j].push_back(i);
    for(int j=1;j<B;j++)
    {
        for(int i=1;i<=V;i++) pd[i]=0;for(int i=j;i<=V;i+=j) pd[i]=1;
        for(int i=1;i<=n;i++) c[i]=c[i-1]+(a[i]==j),s[i]=s[i-1]+pd[a[i]];
        for(int i=1;i<=m;i++) ans2[i]+=(s[q[i].r]-s[q[i].l-1])*(c[q[i].r]-c[q[i].l-1]);
    }
    for(int i=1;i<=n;i++)
    {
        int x=a[i];
        if(x<B) {s[i]=s[i-1];continue;}
        s[i]=s[i-1]+t[x];
        for(int j=x;j<=V;j+=x) t[j]++;
        for(int j:p[x]) t[j]++;
    }
    sort(q+1,q+1+m,[&](node a,node b){return a.l/B==b.l/B?a.r<b.r:a.l<b.l;});
    for(int i=1,l=1,r=0;i<=m;i++)
    {
        if(l>q[i].l) ans[q[i].id]-=s[l-1]-s[q[i].l-1],v[r].push_back({q[i].l,l-1,1,q[i].id}),l=q[i].l;
        if(r<q[i].r) ans[q[i].id]+=s[q[i].r]-s[r],v[l-1].push_back({r+1,q[i].r,-1,q[i].id}),r=q[i].r;
        if(l<q[i].l) ans[q[i].id]+=s[q[i].l-1]-s[l-1],v[r].push_back({l,q[i].l-1,-1,q[i].id}),l=q[i].l;
        if(r>q[i].r) ans[q[i].id]-=s[r]-s[q[i].r],v[l-1].push_back({q[i].r+1,r,1,q[i].id}),r=q[i].r;
    }
    memset(t,0,sizeof(t));
    for(int i=1;i<=n;i++)
    {
        int x=a[i];
        if(x>=B)
        {
            for(int j=x;j<=V;j+=x) t[j]++;
            for(int j:p[x]) t[j]++;
        }
        for(auto &[l,r,w,id]:v[i]) for(int j=l;j<=r;j++) if(a[j]>=B) ans[id]+=(t[a[j]]-2*(j<=i))*w;
    }
    for(int i=1;i<=m;i++) ans[q[i].id]+=ans[q[i-1].id];
    for(int i=1;i<=m;i++) cout<<ans[i]+ans2[i]<<'\n';
    ed=clock();
    cout<<("time :")<<(double)(ed-st)/CLOCKS_PER_SEC<<'\n';
}
2023/12/26 12:22
加载中...