題目描述
給出乙個長為 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 ...