Loj 6282. 数列分块入门 6

Posted zjxxcn

tags:

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

题目描述

给出一个长为 nnn 的数列,以及 nnn 个操作,操作涉及单点插入,单点询问,数据随机生成。

输入格式

第一行输入一个数字 nnn。

第二行输入 nnn 个数字,第 i 个数字为 aia_iai?,以空格隔开。

接下来输入 nnn 行询问,每行输入四个数字 optmathrm{opt}opt、lll、rrr、ccc,以空格隔开。

若 opt=0mathrm{opt} = 0opt=0,表示在第 lll 个数字前插入数字 rrr (ccc 忽略)。

若 opt=1mathrm{opt} = 1opt=1,表示询问 ara_rar? 的值(lll 和 ccc 忽略)。

输出格式

对于每次询问,输出一行一个数字表示答案。

样例

样例输入

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

样例输出

2
3

数据范围与提示

对于 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。

 

ps: 暴力维护每个区间,发现用了vector的insert操作,程序变的好慢。

拓展,如果数据不是随机的,我们可以在sqrt(n)次插入操作以后,重新构造分块。 

技术分享图片
 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 vector<int> v[403];   
22 
23 int n,B,a[maxn]; 
24 
25 void update(int l,int r){
26     int x=0;  
27     F(i,1,bl(n)) if(v[i].size()<l) l-=v[i].size();  
28     else  {
29         x=i; break;  
30     }
31     v[x].insert(v[x].begin()+l-1,r);  
32 }
33 
34 int query(int x){
35     int k=0;  
36     F(i,1,bl(n)) if(v[i].size()<x) x-=v[i].size();  
37     else {
38         k=i; break;  
39     }
40     return v[k][x-1]; 
41 }
42 
43 int main(){
44     n=read(); 
45     B=(int) sqrt(n);  
46     F(i,1,n) a[i]=read(); 
47     F(i,1,bl(n)) F(j,st(i),ed(i)) {
48         v[i].push_back(a[j]);  
49     }
50     F(i,1,n){
51         int x=read(); 
52         int l=read(); 
53         int r=read(); 
54         int c=read(); 
55         if(x==0) update(l,r); 
56         else printf("%d
",query(r)); 
57     }
58     return 0; 
59 }
View Code

 

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

LOJ#6282. 数列分块入门 6

Loj 6282. 数列分块入门 6

#6282. 数列分块入门 6

#6282. 数列分块入门 6

LibreOJ 6282. 数列分块入门 6

loj数列分块入门