1. 程式人生 > >Loj 6284. 數列分塊入門 8

Loj 6284. 數列分塊入門 8

fin -c plain its oid spl hid col long

題目描述

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

輸入格式

第一行輸入一個數字 nnn。

第二行輸入 nnn 個數字,第 i 個數字為 aia_iai?,以空格隔開。

接下來輸入 nnn 行詢問,每行輸入三個數字 lll、rrr、ccc,以空格隔開。

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

輸出格式

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

樣例

樣例輸入

4
1 2 2 4
1 3 1
1 4 4
1 2 2
1 4 2

樣例輸出

1
1
0
2

數據範圍與提示

對於 100% 100\%100% 的數據,1≤n≤100000,?231≤others 1 \leq n \leq 100000, -2^{31} \leq \mathrm{others}1n100000,?231others、ans≤231?1 \mathrm{ans} \leq 2^{31}-1ans231?1。

技術分享圖片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define F(i,a,b) for(int i=a;i<=b;i++) 
 5
#define D(i,a,b) for(int i=a;i>=b;i--) 6 #define ms(i,a) memset(a,i,sizeof(a)) 7 #define LL long long 8 #define st(x) ((x-1)*B+1) 9 #define ed(x) min(x*B,n) 10 #define bl(x) ((x-1)/B+1) 11 12 int inline read(){ 13 int x=0,w=0; char c=getchar(); 14 while (c<0 || c>
9) w+=c==-,c=getchar(); 15 while (c>=0 && c<=9) x=(x<<3)+(x<<1)+(c^48),c=getchar(); 16 return w? -x: x; 17 } 18 19 int const maxn=100003; 20 21 map<int,int> mat; 22 23 int n,B=400,a[maxn],sum,t[251]; 24 25 int query(int l,int r,int z){ 26 int x=bl(l); 27 int y=bl(r); 28 int ans=0; 29 if(x==y){ 30 if(t[x]>-1){ 31 if(t[x]==z) ans=r-l+1; 32 }else F(i,l,r) if(a[i]==z) ans++; 33 }else { 34 if(t[x]>-1){ 35 if(t[x]==z) ans+=ed(x)-l+1; 36 }else F(i,l,ed(x)) if(a[i]==z) ans++; 37 if(t[y]>-1){ 38 if(t[y]==z) ans+=r-st(y)+1; 39 }else F(i,st(y),r) if(a[i]==z) ans++; 40 F(i,x+1,y-1){ 41 if(t[i]>-1) { 42 if(t[i]==z) ans+=ed(i)-st(i)+1; 43 }else F(j,st(i),ed(i)) if(a[j]==z) ans++; 44 } 45 } 46 return ans; 47 } 48 49 void update(int l,int r,int z){ 50 int x=bl(l); 51 int y=bl(r); 52 if(x==y){ 53 if(t[x]>-1) F(i,st(x),ed(x)) a[i]=t[x] ; 54 t[x]=-1; 55 F(i,l,r) a[i]=z; 56 }else { 57 if(t[x]>-1) F(i,st(x),ed(x)) a[i]=t[x]; 58 if(t[y]>-1) F(i,st(y),ed(y)) a[i]=t[y]; 59 t[x]=t[y]=-1; 60 F(i,l,ed(x)) a[i]=z; 61 F(i,st(y),r) a[i]=z; 62 F(i,x+1,y-1) t[i]=z; 63 } 64 } 65 66 67 int main(){ 68 n=read(); 69 ms(-1,t); 70 F(i,1,n){ 71 a[i]=read(); 72 if(mat[a[i]]==0) mat[a[i]]=++sum; 73 a[i]=mat[a[i]]; 74 } 75 F(i,1,n){ 76 int l=read(); 77 int r=read(); 78 int x=read(); 79 if(mat[x]==0) mat[x]=++sum; 80 x=mat[x]; 81 printf("%d\n",query(l,r,x)); 82 update(l,r,x); 83 } 84 return 0; 85 }
View Code

Loj 6284. 數列分塊入門 8