LOJ 6283 數列分塊入門 7

2022-04-29 02:54:09 字數 1283 閱讀 6510

區間加,區間乘,單點查詢。

跟線段樹的差不多,為了避免精度問題要先乘再加。區別也和其他的差不多,殘塊暴力。然後就沒什麼了。scanf讀int要& !

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int mod = 10007;7

8int atag[350],mtag[350],v[100010],bl[100010];9

intn,blo,opt,l,r,c;

1011

void down(int

x)21

22void add(int l,int r,int

c)29

down(bl[l]),down(bl[r]);

30for(int i = l;i <= bl[l]*blo;i++)

31 v[i] += c,v[i] %=mod;

32for(int i = (bl[r]-1)*blo+1;i <= r;i++)

33 v[i] += c,v[i] %=mod;

34for(int i = bl[l]+1;i < bl[r];i++)

35 atag[i] += c,atag[i] %=mod;36}

3738

int ask(int

x)41

42void mul(int l,int r,int

c)49

down(bl[l]),down(bl[r]);

50for(int i = l;i <= bl[l]*blo;i++)

51 v[i] *= c,v[i] %=mod;

52for(int i = (bl[r]-1)*blo+1;i <= r;i++)

53 v[i] *= c,v[i] %=mod;

54for(int i = bl[l]+1;i < bl[r];i++)

55 atag[i] *= c,atag[i] %=mod,

56 mtag[i] *= c,mtag[i] %=mod; 57}

5859

intmain()

66for(int i = 1;i <= bl[n];i++)mtag[i] = 1;67

for(int i = 1;i <= n;i++)74}

75return0;

76 }

LOJ 6283 數列分塊入門 7

記憶體限制 256 mib時間限制 500 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 上傳者 hzwer 提交提交記錄 統計討論 測試資料 題目描述 給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間乘法,區間加法,單點詢問。輸入格式 第一行輸入乙個數字 nnn。第二行輸入 ...

LibreOJ 6283 數列分塊入門 7

題意 給你乙個n nn個整數的序列a aa,讓你進行三種操作 分析 這裡顯而易見的是,如果我們分塊,那麼需要兩個標記來儲存加法標記和乘法標記,那麼這裡有個關鍵問題,就是順序,順序不同結果不同 我們修改的時候是有順序的,而我們對於標記的操作,到最後是統一修改的,並不考慮乘法和加法的順序 假設這裡有乙個...

LOJ 數列分塊入門 1

link 優雅的暴力,對於乙個數列,他不是乙個元素乙個元素處理,而是分成若干塊,成塊成塊的處理,以此達到降低時間複雜度的目的。首先,我們需要處理劃分的塊的大小 block 一般是根號n 塊的數目 每乙個元素對應第幾塊,然後,每一塊的左端點和右端點。完整的塊 更新 我們用lz i lz i lz i ...