Loj 6284. 数列分块入门 8

Posted zjxxcn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Loj 6284. 数列分块入门 8相关的知识,希望对你有一定的参考价值。

题目描述

给出一个长为 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
",query(l,r,x)); 
82         update(l,r,x);  
83     }
84     return 0; 
85 }
View Code

 

以上是关于Loj 6284. 数列分块入门 8的主要内容,如果未能解决你的问题,请参考以下文章

Loj 6284. 数列分块入门 8

loj数列分块入门

loj#6281. 数列分块入门 5

Loj 6285. 数列分块入门 9

Loj 6282. 数列分块入门 6

Loj 6280 数列分块入门 4