学习珂学的最好方法是

P3987 我永远喜欢珂朵莉~

@[STAR_czy](/user/925716) 你小子很危险啊,luogu差点臭名昭著(逃
by Steve_xh @ 2023-12-31 16:55:05


??罵,还说不玩梗,这不就是要我们写代码给你看?
by 13eric @ 2023-12-31 17:05:08


@[STAR_czy](/user/925716) 经不官方认定,你属于危险人群~~请尽快自首~~
by bca_ @ 2023-12-31 17:10:58


我看你想重温[此帖](https://www.luogu.com.cn/discuss/61884)
by danlao @ 2023-12-31 17:17:19


你现在就只差$\colorbox{orange}{\color{blue}说句闲话}$ 了
by danlao @ 2023-12-31 17:20:13


@[Steve_xh](/user/639198) @[13eric](/user/1008942) @[yaodiguoan](/user/1023793) 请问能不能尝试找出问题呢?
by STAR_czy @ 2023-12-31 17:25:32


哦对,我差点就忘了我来到这个帖子的目的了。
by danlao @ 2023-12-31 17:29:55


我服了你这格式了
by danlao @ 2023-12-31 17:30:38


@[yaodiguoan](/user/1023793) 现在是后面全T了 ```cpp #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e5+10,maxm=5e7+10,mod=1e9+7; int n,m,tot,tmpt,a[maxn],root[maxn*5],tmp[maxn],dt[maxm],val[maxm],l[maxm],r[maxm]; ll t[maxn]; queue<int> ljt; inline int newnode(int x){ int p; if(ljt.size()) p=ljt.front(),ljt.pop(); else p=++tot; return l[p]=0,r[p]=0,dt[p]=x,p; } int merge(int x,int y){return x&&y?val[x]>val[y]?r[x]=merge(r[x],y),x:(l[y]=merge(x,l[y]),y):x+y;} void split(int p,int v,int &x,int &y){ if(!(bool)p) return (void)(x=y=0); if(dt[p]<=v) x=p,split(r[p],v,r[p],y); else y=p,split(l[p],v,x,l[p]); } int build(int lq,int rq){ if(lq>rq) return 0; if(lq==rq) return newnode(tmp[lq]); int mid=lq+rq>>1,p=newnode(tmp[mid]); return l[p]=build(lq,mid-1),r[p]=build(mid+1,rq),p; } void get(int x,int k){ if(l[x]) get(l[x],k); // cout<<x<<","<<dt[x]<<"]"; if(a[dt[x]]%k==0){ a[dt[x]]/=k; for(int i=dt[x],s=a[dt[x]]*(k-1);i<=n;i+=i&-i) t[i]-=s; if(a[dt[x]]%k==0) tmp[++tmpt]=dt[x]; } if(r[x]) get(r[x],k); ljt.push(x); } void midfor(int x){ if(l[x]) midfor(l[x]); cout<<dt[x]<<" "; if(r[x]) midfor(r[x]); } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m; for(int i=1;i<=n;++i){ cin>>a[i]; for(int j=i;j<=n;j+=j&-j) t[j]+=a[i]; for(int j=1;j*j<=a[i];++j) if(a[i]%j==0){ root[j]=merge(root[j],newnode(i)); if(j*j!=a[i]) root[a[i]/j]=merge(root[a[i]/j],newnode(i)); } } for(int o=1;o<=m;++o){ int opt,l,r; cin>>opt>>l>>r; if(opt==1){ int x,s1,s2,s3; cin>>x; split(root[x],r,s2,s3),split(s2,l-1,s1,s2),tmpt=0; if(s2) get(s2,x),s2=build(1,tmpt); root[x]=merge(s1,merge(s2,s3)); } else{ ll ans=0; for(int i=r;i;i-=i&-i) ans+=t[i]; for(int i=l-1;i;i-=i&-i) ans-=t[i]; cout<<ans<<'\n'; } } return 0; }
by STAR_czy @ 2024-01-05 17:27:13


|