19_08_14-19_02_21校内训练 补题

时间:2019-08-21
本文章向大家介绍19_08_14-19_02_21校内训练 补题,主要包括19_08_14-19_02_21校内训练 补题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.给两个非严格递增的序列,每次分别从两个数组中抽出一个区间并合并,求排序后第k小。单log。

分治即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5E5+5;
 4 int n,m,a[maxn],b[maxn];
 5 inline int read()
 6 {
 7     char ch=getchar();
 8     while(!isdigit(ch))
 9         ch=getchar();
10     int sum=ch-'0';
11     ch=getchar();
12     while(isdigit(ch))
13     {
14         sum=sum*10+ch-'0';
15         ch=getchar();
16     }
17     return sum;
18 }
19 void write(int x)
20 {
21     if(x>=10)
22         write(x/10);
23     putchar('0'+x%10);
24 }
25 inline void writen(int x)
26 {
27     write(x);
28     putchar('\n');
29 }
30 int ask(int*A,int*B,int lenA,int lenB,int k)
31 {
32     if(lenA>lenB)
33         return ask(B,A,lenB,lenA,k);
34     if(lenA==0)
35         return B[k];
36     if(k==1)
37         return min(A[1],B[1]);
38     int x=min(lenA,k/2);
39     int y=k-x;
40     if(A[x]<B[y])
41         return ask(A+x,B,lenA-x,lenB,y);
42     else
43         return ask(A,B+y,lenA,lenB-y,x);
44 }
45 inline int query(int L1,int R1,int L2,int R2)
46 {
47     int len=R1-L1+R2-L2+2;
48     return ask(a+L1-1,b+L2-1,R1-L1+1,R2-L2+1,len/2+1);
49 }
50 int main()
51 {
52     ios::sync_with_stdio(false);
53     n=read(),m=read();
54     for(int i=1;i<=n;++i)
55         a[i]=read();
56     for(int i=1;i<=n;++i)
57         b[i]=read();
58     while(m--)
59     {
60         int opt=read();
61         if(opt == 2)
62         {
63             int L1=read(),R1=read();
64             int L2=read(),R2=read();
65             writen(query(L1,R1,L2,R2));
66         }
67         else
68         {
69             int p=read(),pos=read(),x=read();
70             if(p==0)
71                 a[pos]=x;
72             else
73                 b[pos]=x;
74         }
75     }
76     return 0;
77 }
View Code

原文地址:https://www.cnblogs.com/GreenDuck/p/11389500.html