[题解]hdu5634 Rikka with Phi
来源:互联网 发布:乱世佳人电影结局知乎 编辑:程序博客网 时间:2024/06/07 05:36
Description
题目大意:
给出一个长度为 n 的序列
1. 给出 l, r,将所有的
2. 给出 l, r, x,将所有的
3. 给出 l, r,询问
数据范围:
Solution
我们发现一个数x连续取log次
现在带上修改怎么办呢?我们发现如果一个区间内的数全部相等在对这个区间取
根据我们的算法,我们可以把相同的一段区间看作一个数字。那么每一次覆盖操作最多增加一个数字,均摊下来不会降低取欧拉函数操作的复杂度。
所以总的时间复杂度是
代码:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;template<typename T>inline void read(T &x){ T f=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(x=0;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; x*=f;}typedef long long LL;const int maxn=300010,maxm=10000000;int phi[maxm+10];struct Segment_Tree{ #define lc x<<1 #define rc x<<1|1 #define mem(x) memset(x,0,sizeof x) int L[maxn<<2],R[maxn<<2],mx[maxn<<2],mi[maxn<<2],same[maxn<<2]; LL sum[maxn<<2]; void clear(){ mem(L);mem(R);mem(mx); mem(mi);mem(sum);mem(same); } void update(int x){ mx[x]=max(mx[lc],mx[rc]); mi[x]=min(mi[lc],mi[rc]); sum[x]=sum[lc]+sum[rc]; } void Build(int x,int *a,int l,int r){ if((L[x]=l)==(R[x]=r))return sum[x]=mx[x]=mi[x]=a[l],void(); int mid=(l+r)>>1; Build(lc,a,l,mid);Build(rc,a,mid+1,r); update(x); } void pushsame(int x,int val){ same[x]=mx[x]=mi[x]=val; sum[x]=(LL)(R[x]-L[x]+1)*val; } void pushdown(int x){ if(!same[x])return; pushsame(lc,same[x]); pushsame(rc,same[x]); same[x]=0; } void Change(int x,int l,int r,int val){ if(R[x]<l||L[x]>r)return; if(L[x]>=l&&R[x]<=r)return pushsame(x,val),void(); pushdown(x); Change(lc,l,r,val);Change(rc,l,r,val); update(x); } void Modify(int x,int l,int r){ if(R[x]<l||L[x]>r)return; if(L[x]>=l&&R[x]<=r&&mx[x]==mi[x])return pushsame(x,phi[mx[x]]),void(); pushdown(x); Modify(lc,l,r);Modify(rc,l,r); update(x); } LL Query(int x,int l,int r){ if(R[x]<l||L[x]>r)return 0; if(L[x]>=l&&R[x]<=r)return sum[x]; pushdown(x); return Query(lc,l,r)+Query(rc,l,r); }}tree;int T,n,m,a[maxn],prime[maxm+10];bool ok[maxm+10];void Make(){ phi[1]=1; for(int i=2;i<=maxm;i++){ if(!ok[i])phi[prime[++prime[0]]=i]=i-1; for(int j=1;j<=prime[0]&&i*prime[j]<=maxm;j++){ ok[i*prime[j]]=true; if(i%prime[j])phi[i*prime[j]]=phi[i]*(prime[j]-1); else{ phi[i*prime[j]]=phi[i]*prime[j]; break; } } }}int main(){ read(T);Make(); while(T--){ read(n);read(m); for(int i=1;i<=n;i++)read(a[i]); tree.clear();tree.Build(1,a,1,n); while(m--){ int opt,l,r,x; read(opt);read(l);read(r); if(opt==1)tree.Modify(1,l,r); else if(opt==2)read(x),tree.Change(1,l,r,x); else printf("%lld\n",tree.Query(1,l,r)); } } return 0;}
阅读全文
0 0
- [题解]hdu5634 Rikka with Phi
- HDU5634-Rikka with Phi
- HDU5634 Rikka with Phi(线段树)
- 【hdu5634】Rikka with Phi(线段树+欧拉函数)
- hdu5634 BestCoder Round #73 (div.1) Rikka with Phi 解题报告
- HDU 5634 Rikka with Phi
- HDU 5634 Rikka with Phi
- HDU 5634 Rikka with Phi
- HDU 5634 Rikka with Phi (线段树)
- HDU 5634 Rikka with Phi(线段树)
- HDU 5634 Rikka with Phi(暴力、线段树)
- hdoj 5634 Rikka with Phi 【线段树 + 欧拉】
- HDU 5634-Rikka with Phi(线段树区间更新)
- [均摊 平衡树 || 线段树] HDU 5634 Rikka with Phi
- 【hihocoder1455】Rikka with Tree III 题解
- HDU 5634 Rikka with Phi(线段树+欧拉函数)
- hdu5634
- HDU 6092 Rikka with Subset(题解解释)
- 难理解的c代码(1)
- arraycopy方法和二维数组
- Fiddler--下载安装、原理、教程
- 自定义view group
- Java基础知识总结(绝对经典)
- [题解]hdu5634 Rikka with Phi
- 【经验随笔】Restlet Client发送XML格式参数消息
- i2c 相关知识总结
- CentOS6.4 配置iptables
- 端口被占用问题
- stack链式C++
- 【HTML5学习笔记】20:CSS文本样式 下
- javascript面向对象
- RepositionBars的用法和参数分析