1 条题解

  • 0
    @ 2026-4-30 20:47:02

    还好子任务告诉了我特殊之处不然我起码还得卡十亿年。

    这个题目也是非常的简单啊,你注意 k10k\le 10,那么对于每一个数字它在 k=2k=2 的时候最多除 3030 次就会变成 00,所以我们直接暴力修改即可。

    我们用线段树维护两个信息:区间和以及区间最大值。

    • 修改时对于区间最大值 maxnk1maxn\le k-1 的情况,我们直接返回把这个区间的 tagtag 设为 11,表示这个区间的所有数字全部变成了 00。因为只要比 kk 小,无论如何除完后都是 00
    • 然后对于区间最大值 kmaxnk\le maxn 的情况,我们直接递归到叶子节点暴力操作修改即可。

    好的这个题就做完了。注意一下这个阴间的 k=1k=1 的情况啊,相当于没除,把它特判掉就好了。

    #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
    上传者