hdu 5239 Doom
题意:给n个数,每次查询[l,r]的和,然后[l,r]之间的数都会由ai变为ai^2,开始计数器为0,每次在上一次的基础上,为计数器+sum[l,r],答案%9223372034707292160
分析:猜想一个数的平方%p应该会很快进入静止,即ai^2%p=ai,这样这个数就不会更新,用java跑了一发,发现最多更新29次,其实这个无所谓,猜想到这个性质就可以了,然后就是解决下一个问题,mod^2很大,long long也存不下,解决了这个问题,我想剩下的就很简单了,a*a=a个a相加,使用类似于快速幂的形式,求a个a相加并对mod取模的值,用一个lay[rt]表示该节点代表的子树不会被更新,这样就Ok了,裸的线段树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include<bits/stdc++.h> #define mmid int mid=(l+r)>>1 #define lson rt*2 #define rson rt*2+1 using namespace std; typedef long long ll; const ll mod=9223372034707292160LL; const int maxn=1e5+5; ll sum[maxn<<2]; bool lay[maxn<<2]; int ql,qr; inline bool isdight( char c){ return c>= '0' &&c<= '9' ;} void read(ll &res){ char c= getchar (); res=0; while (!isdight(c))c= getchar (); while (isdight(c))res=res*10+c- '0' ,c= getchar (); } void read( int &res){ char c= getchar (); res=0; while (!isdight(c))c= getchar (); while (isdight(c))res=res*10+c- '0' ,c= getchar (); } inline void Mod(ll &x){ if (x>=mod)x%=mod;} void build( int rt, int l, int r){ lay[rt]=0; if (l==r){ read(sum[rt]); //scanf("%lld",sum+rt); return ; } mmid; build(lson,l,mid); build(rson,mid+1,r); sum[rt]=(sum[lson]+sum[rson]);Mod(sum[rt]); } ll pow_add(ll a){ ll res=0,t=a,k=a; while (k){ if (k&1)res=(t+res),Mod(res); t=(t+t);Mod(t); k=k>>1; } return res; } ll query( int rt, int l, int r){ if (ql<=l&&qr>=r) return sum[rt]; mmid; ll res=0; if (ql<=mid)res=(res+query(lson,l,mid)),Mod(res); if (qr>mid)res=(res+query(rson,mid+1,r)),Mod(res); return res; } void modify( int rt, int l, int r){ if (lay[rt]) return ; if (l==r){ ll t=pow_add(sum[rt]); if (t==sum[rt])lay[rt]=1; else sum[rt]=t; return ; } mmid; if (ql<=mid&&!lay[lson])modify(lson,l,mid); if (qr>mid&&!lay[rson])modify(rson,mid+1,r); lay[rt]=(lay[lson]|lay[rson]); sum[rt]=(sum[lson]+sum[rson]);Mod(sum[rt]); } int main(){ int t,n,q,cas=1,l,r; read(t); while (t--){ read(n);read(q); build(1,1,n); printf ( "Case #%d:\n" ,cas++); ll s=0; while (q--){ read(ql);read(qr); s=(s+query(1,1,n));Mod(s); printf ( "%lld\n" ,s); modify(1,1,n); } } return 0; } |
分类:
线段树
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee