6284 數列分塊入門 8

2022-08-15 05:33:08 字數 1406 閱讀 6244

題目描述

給出乙個長為 n的數列,以及 n 個操作,操作涉及區間詢問等於乙個數 c 的元素,並將這個區間的所有元素改為 c。

輸入格式

第一行輸入乙個數字 n。

第二行輸入 n個數字,第 i 個數字為 ai​,以空格隔開。

接下來輸入 n行詢問,每行輸入三個數字 l、r、c,以空格隔開。

表示先查詢位於 [l,r] 的數字有多少個是 c,再把位於 [l,r] 的數字都改為 c。

輸出格式

對於每次詢問,輸出一行乙個數字表示答案。

樣例樣例輸入

4

1 2 2 4

1 3 1

1 4 4

1 2 2

1 4 2

樣例輸出

110

2思路:和第5題差不多,用乙個標記陣列flag標記整塊的值。沒有標記和不完整塊的暴力找,因為沒有標記暴力找

的時間複雜度就o(n)。注意不完整塊需要更新現在的值,因為有可能前面整塊出現,導致沒有更新值,但flag標記了。

**:

#include#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

typedef

long

long

ll;const

int maxn=1e5+10

;int

a[maxn],pos[maxn],flag[maxn],n,block,ans;

void reset(int x)//

更新不完整塊的值

flag[pos[x]]=-1;//

記得更新標記值

}int query(int l,int r,int

c)

if(pos[l]!=pos[r])//

右不完整塊暴力加

}for(int i=pos[l]+1;i<=pos[r]-1;i++)//

完整塊用flag處理

}else

if(flag[i]==c)//

整塊相等

ans+=block;

flag[i]=c;//

記得標記更新

}

return

ans;

}int

main()

for(int i=0;i<=pos[n];i++)

flag[i]=-1

;

intl,r,c;

for(int i=0;i)

return0;

}

loj 6284 數列分塊入門 8

題目描述 給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間詢問等於乙個數 ccc 的元素,並將這個區間的所有元素改為 ccc。輸入格式 第一行輸入乙個數字 nnn。第二行輸入 nnn 個數字,第 i 個數字為 aia ia i 以空格隔開。接下來輸入 nnn 行詢問,每行輸入三個數字...

數列分塊入門 8 總結

這題我們只需設個check i 表示第i塊是否都為乙個數,b i 表示第i塊變成的數。然後暴力搞就可以了。至於為什麼,我們看看hzwer大佬 黃學長 的解釋吧 d a l a o 上標 include include include define n 100010 using namespace s...

分塊3 6279 數列分塊入門 3

題目描述 給出乙個長為 nn 的數列,以及 nn 個操作,操作涉及區間加法,詢問區間內小於某個值 xx 的前驅 比其小的最大元素 輸入格式 第一行輸入乙個數字 nn。第二行輸入 nn 個數字,第 ii 個數字為 a iai 以空格隔開。接下來輸入 nn 行詢問,每行輸入四個數字 mathrmopt ...