zoukankan      html  css  js  c++  java
  • Loj 6283. 数列分块入门 7

    链接:https://loj.ac/problem/6283

    思路:

    多重标记下放,之前写过线段树的多重标记,两个思路是一样的,都是优先处理乘法操作,如果当前块出现乘法操作,那么加法标记也要乘上乘法标记,这样运算的时候就可以直接乘上乘法标记加上加法标记

    如果当前块出现加法操作,那只对加法标记有影响,加上去就好了

    实现代码;

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int M = 1e5+10;
    int mtag[M],atag[M],a[M],bl[M],n,block;
    const int mod = 10007;
    void resert(int x){
        for(int i = (x-1)*block+1;i <= min(x*block,n);i ++)
            a[i] = (a[i]*mtag[x] + atag[x])%mod;
        atag[x] = 0; mtag[x] = 1;
    }
    
    void update(int f,int l,int r,int c){
         resert(bl[l]);
         for(int i = l;i <= min(bl[l]*block,r);i ++){
            if(f == 1) a[i] = (a[i]*c)%mod;
            else a[i] = (a[i]+c)%mod;
         }
         if(bl[l] != bl[r]){
            resert(bl[r]);
            for(int i = (bl[r]-1)*block+1;i <= r;i ++){
                if(f == 1) a[i] = (a[i]*c)%mod;
                else a[i] = (a[i] + c)%mod;
             }
         }
         for(int i = bl[l]+1;i <= bl[r]-1;i ++){
            if(f == 1) {
                atag[i] = (atag[i]*c)%mod; mtag[i] = (mtag[i]*c)%mod;
            }
            else atag[i] = (atag[i]+c)%mod;
         }
    }
    
    int main()
    {
        int f,l,r,c;
        scanf("%d",&n);
        block = sqrt(n);
        for(int i = 1;i <= n;i ++)  scanf("%d",&a[i]);
        for(int i = 1;i <= n;i ++)  bl[i] = (i-1)/block + 1;
        for(int i = 1;i <= bl[n];i ++)  mtag[i] = 1,atag[i] = 0;
        for(int i = 1;i <= n;i ++){
            scanf("%d%d%d%d",&f,&l,&r,&c);
            if(f == 2) printf("%d
    ",(a[r]*mtag[bl[r]] + atag[bl[r]])%mod);
            else update(f,l,r,c);
        }
        return 0;
    }
  • 相关阅读:
    c++中static的使用
    sublime3 ctl+b无效
    Maximum Subarray
    Find the Duplicate Number
    Reverse Linked List
    c++ primer 2 变量和基本类型
    Single Number II
    Roman to Integer & Integer to Roman
    Search Insert Position
    Unique Binary Search Trees II
  • 原文地址:https://www.cnblogs.com/kls123/p/9376975.html
Copyright © 2011-2022 走看看