[Ynoi2013]大学

0|1题目传送门

1|0题意

  • 非负整数序列,支持 区间和查询 和 区间所有某数倍数除以其。

2|0Sol

真就卡常 最后改成指针才行

考虑一个数的因数个数不超过 2ai,不妨对每个因数开链表,记录其倍数位置。

考虑每个数最多能被操作 logai 次,我们每次暴力修改链表就行了。

区间和可以写个 BIT,毕竟常数小。(

总复杂度 O(nai+nlognlogai)

// wish to get better qwq #include<bits/stdc++.h> #define re register int #define pb push_back using namespace std; typedef long long ll; template <typename T> void rd(T &x){ int fl=1;x=0;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') fl=-fl; for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0'; x*=fl; } void wr(ll x){ if(x<0) x=-x,putchar('-'); if(x<10) putchar(x+'0'); if(x>9) wr(x/10),putchar(x%10+'0'); } // ---------- IO ---------- // const int N=5e5+5; int n,m,a[N]; vector<int> f[N],fa[N]; ll sum[N],ans; inline int lowbit(int x){return x&(-x);} inline void add(int x,ll k){ while(x<=n) sum[x]+=k,x+=lowbit(x); } inline ll query(int x){ ll s=0; while(x) s+=sum[x],x-=lowbit(x); return s; } // ---------- BIT ---------- // inline int found(int pos,int x){ if(x>=fa[pos].size()) return x; return fa[pos][x]==x?fa[pos][x]:fa[pos][x]=found(pos,fa[pos][x]); } // ---------- DSU ---------- // int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); rd(n);rd(m); for(re i=1;i<=n;++i){ rd(a[i]);add(i,a[i]); for(re j=1;j*j<=a[i];++j) if(a[i]%j==0){ f[j].pb(i);fa[j].pb(fa[j].size()); if(j*j!=a[i]) f[a[i]/j].pb(i),fa[a[i]/j].pb(fa[a[i]/j].size()); } } int op,l,r,x; for(re i=1;i<=m;++i){ rd(op);rd(l);rd(r);l^=ans;r^=ans; if(op==1){ rd(x);x^=ans; if(x==1) continue; int st=lower_bound(f[x].begin(),f[x].end(),l)-f[x].begin(); for(re j=found(x,st);j<f[x].size()&&f[x][j]<=r;j=found(x,j+1)){ if(a[f[x][j]]%x==0) add(f[x][j],a[f[x][j]]/x-a[f[x][j]]),a[f[x][j]]/=x; if(a[f[x][j]]%x!=0) fa[x][j]=found(x,j+1); } } else wr(ans=query(r)-query(l-1)),puts(""); } return 0; } // ---------- Main ---------- //

然后你就发现被卡常了

预计得分 62

我们考虑卡常。(

把数组全部改成指针即可。(

注意细节,不要 <= 写成 <。(

会 RE 飞。(

// wish to get better qwq #include<bits/stdc++.h> #define re register int #define pb push_back #define lb lower_bound #define ub upper_bound using namespace std; typedef long long ll; template <typename T> void rd(T &x){ int fl=1;x=0;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') fl=-fl; for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0'; x*=fl; } void wr(ll x){ if(x<0) x=-x,putchar('-'); if(x<10) putchar(x+'0'); if(x>9) wr(x/10),putchar(x%10+'0'); } // ---------- IO ---------- // const int N=5e5+5; int n,m,a[N],cnt[N],maxn,*p[N],node[N*505],*tp=node; ll sum[N],ans; inline int ma(int x,int y){return x<y?y:x;} inline void add(int x,ll k){ while(x<=n) sum[x]+=k,x+=x&(-x); } inline ll query(int x){ ll s=0; while(x) s+=sum[x],x^=x&(-x); return s; } // ---------- BIT ---------- // struct DSU{ int *fa; inline void init(int n){for(re i=0;i<n;++i) fa[i]=i;} inline int found(int x){return fa[x]==x?x:fa[x]=found(fa[x]);} }nxt[N]; // ---------- DSU ---------- // inline void modify(int l,int r,int x){ l=lb(p[x],p[x]+cnt[x],l)-p[x]; r=ub(p[x],p[x]+cnt[x],r)-p[x]-1; if(l>r) return ; for(re nw=nxt[x].found(l);nw<=r;nw=nxt[x].found(nw+1)){ int t=p[x][nw]; if(a[t]%x==0) add(t,a[t]/x-a[t]),a[t]/=x; if(nw>=r) break; if(a[t]%x) nxt[x].fa[nw]=nxt[x].found(nw+1); } } int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); rd(n);rd(m); for(re i=1;i<=n;++i){ rd(a[i]);add(i,a[i]); cnt[a[i]]++;maxn=ma(maxn,a[i]); } for(re i=1;i<=maxn;++i) for(re j=i+i;j<=maxn;j+=i) cnt[i]+=cnt[j]; for(re i=1;i<=maxn+1;++i) if(cnt[i]){ p[i]=tp;tp+=cnt[i]; nxt[i].fa=tp;nxt[i].init(cnt[i]); tp+=cnt[i];cnt[i]=0; } for(re i=1;i<=n;++i){ for(re j=1;j*j<=a[i];++j) if(a[i]%j==0){ p[j][cnt[j]++]=i; if(j*j!=a[i]) p[a[i]/j][cnt[a[i]/j]++]=i; } } int op,l,r,x; for(re i=1;i<=m;++i){ rd(op);rd(l);rd(r);l^=ans;r^=ans; if(op==1){ rd(x);x^=ans; if(x==1) continue; modify(l,r,x); } else wr(ans=query(r)-query(l-1)),puts(""); } return 0; } // ---------- Main ---------- //

__EOF__

本文作者Daniel Jiang
本文链接https://www.cnblogs.com/danieljiang/p/daxue.html
关于博主:JSOIer 高一萌新 求带/kel
版权声明:awa
声援博主:求赞/kel
posted @   Demoe  阅读(88)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示