TLE三个,孩子已经傻了
查看原帖
TLE三个,孩子已经傻了
379819
MattiaBinotto楼主2020/10/29 22:07
#\
p\
r\
a\
g\
m\
a\
 \
G\
C\
C\
 \
t\
a\
r\
g\
e\
t\
(\
"\
a\
v\
x\
,\
s\
s\
e\
2\
,\
s\
s\
e\
3\
,\
s\
s\
e\
4\
,\
m\
m\
x\
"\
)
#include<bits/stdc++.h>
using namespace std; 
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,2097152,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
inline int read(){
    int w(0);
	char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')w=w*10+(c^48),c=getchar();
    return w;
}
inline void print(long long x) {
    if(x>9) print(x/10);
    *O++=x%10+'0';
}
inline long long readll(){
    long long w(0);
	char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')w=w*10+(c^48),c=getchar();
    return w;
}
long long tree[100003];//树状数组
int n,m;
inline long long query(int x)
{
    long long res=0;
    while(x) res+=tree[x],x-=x&(-x);
    return res;
}
inline void add(int x,int k)
{
    while(x<=n) tree[x]+=k,x+=x&(-x);
    return ;
}
int a[100003];
int v[2][22000003];//内存池
int s[500003],pos[500003];
inline int Find(int y)
{
    if(v[1][y]==y) return y;
    return v[1][y]=Find(v[1][y]);
}
inline int BS(int l,int r,int tgt)
{
    int res=r;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(v[0][mid]>=tgt) res=mid,r=mid-1; else l=mid+1;
    }
    return res;
}
signed main()
{
    //double S=clock();
    n=read(),m=read();
    for(int i=1; i<=n; i++) a[i]=read(),add(i,a[i]),++s[a[i]];
    for(int i=2; i<=250000; ++i) { for(int j=2; i*j<=500000; ++j) s[i]+=s[i*j]; s[i]+=s[i-1]+1; }
    for(int i=250001; i<=500001; ++i) s[i]+=s[i-1]+1;
    for(int i=1; i<=s[500001]; ++i) v[1][i]=i;
    for(int i=500001; i>=2; --i) s[i]=s[i-1],pos[i]=s[i]-1;
    for(int i=1,j; i<=n; ++i)
    {        
        if(a[i]<=1) continue;
        v[0][++pos[a[i]]]=i;
        for(j=2; j*j<a[i]; ++j) if(!(a[i]%j)) 
        v[0][++pos[j]]=i,v[0][++pos[a[i]/j]]=i;
        if(j*j==a[i]) v[0][++pos[j]]=i;
    }
    for(int i=2; i<=500000; ++i) v[0][++pos[i]]=1919810,sort(v[0]+s[i],v[0]+s[i+1]);
    for(long long lst=0;m--;)
    {
        int opt=read(),l=(readll()^lst),r=(readll()^lst);
        if(l>r) swap(l,r);
        if(opt&1)
        {
            int x=(readll()^lst),cnt=0;
            if(x==1) continue;
            int st=Find(BS(s[x],s[x+1]-1,l));
            for(int i=st; v[0][i]<=r; i=Find(i+1))
            {
                int tmp=v[0][i];
                if(a[tmp]%x) 
                { 
                    v[1][i]=Find(i+1);
                    continue; 
                }
                add(tmp,-a[tmp]),a[tmp]/=x,add(tmp,a[tmp]);
                if(a[tmp]%x) v[1][i]=Find(i+1);
            }
        }
        else print(lst=(query(r)-query(l-1))),*O++='\n';
    }
    fwrite(obuf,O-obuf,1,stdout);
    //double T=clock();
    //cout<<(T-S)/CLOCKS_PER_SEC<<endl;
	return 0;
}

卡了一天了……谁来救救我

2020/10/29 22:07
加载中...