Loj 6284. 數列分塊入門 8
阿新 • • 發佈:2018-09-26
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}1≤n≤100000,?231≤others、ans≤231?1 \mathrm{ans} \leq 2^{31}-1ans≤231?1。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 #define F(i,a,b) for(int i=a;i<=b;i++) 5View Code#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 }
Loj 6284. 數列分塊入門 8