1 条题解
-
0
还好子任务告诉了我特殊之处不然我起码还得卡十亿年。这个题目也是非常的简单啊,你注意 ,那么对于每一个数字它在 的时候最多除 次就会变成 ,所以我们直接暴力修改即可。
我们用线段树维护两个信息:区间和以及区间最大值。
- 修改时对于区间最大值 的情况,我们直接返回把这个区间的 设为 ,表示这个区间的所有数字全部变成了 。因为只要比 小,无论如何除完后都是 。
- 然后对于区间最大值 的情况,我们直接递归到叶子节点暴力操作修改即可。
好的这个题就做完了。注意一下这个阴间的 的情况啊,相当于没除,把它特判掉就好了。
#include<bits/stdc++.h> using namespace std; #define re register #define ll long long const int N=1e5+10; int a[N]; struct node{ int maxn[N<<2]; ll t[N<<2]; bool tag[N<<2]; inline void push_up(int x){ maxn[x]=max(maxn[x*2],maxn[x*2+1]); t[x]=t[x*2]+t[x*2+1]; } void build(int l,int r,int x){ if(l==r){ t[x]=a[l]; maxn[x]=a[l]; return; } int mid=l+r>>1; build(l,mid,x*2); build(mid+1,r,x*2+1); push_up(x); } inline void push_down(int x){ if(tag[x]){ tag[x*2]=tag[x*2+1]=1; maxn[x*2]=maxn[x*2+1]=t[x*2]=t[x*2+1]=0; tag[x]=0; } } void update(int L,int R,int l,int r,int x,int k){ if(k==1)return; if(L<=l&&r<=R&&maxn[x]<=k-1){ maxn[x]=t[x]=0; tag[x]=1; return; } if(l==r){ t[x]/=k;maxn[x]/=k; return; } push_down(x); int mid=l+r>>1; if(L<=mid)update(L,R,l,mid,x*2,k); if(R>mid)update(L,R,mid+1,r,x*2+1,k); push_up(x); } void change(int pos,int l,int r,int x,int k){ if(l==r){ maxn[x]=t[x]=k;tag[x]=0; return; } push_down(x); int mid=l+r>>1; if(pos<=mid)change(pos,l,mid,x*2,k); else change(pos,mid+1,r,x*2+1,k); push_up(x); } ll ask(int L,int R,int l,int r,int x){ if(L<=l&&r<=R)return t[x]; push_down(x); int mid=l+r>>1; ll res=0; if(L<=mid)res+=ask(L,R,l,mid,x*2); if(R>mid)res+=ask(L,R,mid+1,r,x*2+1); return res; } }tree; int n,q,k; signed main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>q>>k; for(re int i=1;i<=n;i++)cin>>a[i]; tree.build(1,n,1); while(q--){ int op,x,y; cin>>op>>x>>y; if(op==1)tree.change(x,1,n,1,y); else if(op==2)tree.update(x,y,1,n,1,k); else cout<<tree.ask(x,y,1,n,1)<<"\n"; a[x]=y; //for(int i=1;i<=n;i++)cout<<"a["<<i<<"]="<<tree.ask(i,i,1,n,1)<<" ";cout<<"\n"; } return 0; } /*5 10 3 1 2 8 1 3 1 2 5 2 3 5 3 2 5 2 1 4 1 3 2 3 3 5 1 2 4 2 1 2 1 1 4 3 1 5*/
- 1
信息
- ID
- 10154
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者