求助,貌似T了四个点
查看原帖
求助,貌似T了四个点
243750
星空舞涵楼主2020/10/28 15:46

听说貌似手写内存池的,有大佬可以讲一讲吗? 肥肠感谢. 或者帮忙改改代码也行

#include <cmath>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
vector<int>fa[500001];
vector<int>fa2[500001];
int n,m;
long long a[100001];
int ss[100001];
long long  last;


inline void add(int x,long long k)
{
    while(x<=n)
    {
        a[x]+=k;
        x+=(x&(-x));
    }
}


inline long long sum(int x)
{
    long long he=0;
    while(x>0)
    {
        he+=a[x];
        x=x-(x&-x);
    }
    return he;
}


inline int read( )
{
    int f=0;
    char ch;
    ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')
    {
        f=f*10+ch-'0';
        ch=getchar();
    }
    return f;
}
inline int find(int x,int k)
{
    if(k==fa2[x].size()||k==fa2[x][k])return k;
    return fa2[x][k]=find(x,fa2[x][k]);
}

inline void write(long long  X)
{
    if(X<0) {X=~(X-1); putchar('-');}
    if(X>9) write(X/10);
    putchar(X%10+'0');
}
signed main( )
{
    n=read( );
    m=read( );
    for(int i=1;i<=n;++i)
    {
        ss[i]=read();
        for(int j=1;j*j<=ss[i];++j)
        {
            if(ss[i]%j==0)
            {
                fa[j].push_back(i);
                fa2[j].push_back(fa2[j].size());
                if(j*j<ss[i])
                {
                    fa[ss[i]/j].push_back(i);
                    fa2[ss[i]/j].push_back(fa2[ss[i]/j].size());
                }
            }
        }
        add(i,ss[i]);
    }
    int kind,l,r,x;
    for(int i=1;i<=m;i++)
    {
        kind=read( );
        if(kind==1)
        {
            l=read( ),r=read( ),x=read( ),l^=last,r^=last,x^=last;
            if(x==1)continue;
            int wei=lower_bound(fa[x].begin(),fa[x].end(),l)-fa[x].begin();
            for(int i=find(x,wei);i<fa[x].size()&&fa[x][i]<=r;i=find(x,i+1))
            {
                if(ss[fa[x][i]]%x==0)
                {
                    int o=fa[x][i];
                    ss[o]=ss[o]/x;
                    add(o,(long long)(-ss[o]*(x-1)));
                    
                }
                if(ss[fa[x][i]]%x!=0)fa2[x][i]=i+1;
            }
        }
        else{
            l=read( ),r=read( ),l^=last,r^=last;
            last=sum(r)-sum(l-1);
            write(last);
            putchar('\n');
        }
    }
    return 0;
}

2020/10/28 15:46
加载中...