第k小(东方化改题+等我研究一下代码)

啊今天的题一道不会……

所以只把标程代码放上来……

当然如果有一天我研究明白了会给标程附上注释的……

不要指望我自己写题解了(

原题在这里↓

(由于破pdf复制不出来所以纯手打的!知道吗!)

题目描述

给出一个长度为n的正整数数组A,有m次操作,操作有两种:修改和询问

修改:修改A[i];

询问:输出数组中第k小的正整数的值。

输入输出格式

输入格式

第一行一个正整数n;

第二行n个正整数,第i个数表示A[i]的值;

第三行一个正整数m;

接下来m行,首先读入一个整数op,

op = 1表示修改,接下来读入两个正整数x,y表示把A[i]修改成y

op = 2表示询问,接下来读入一个正整数k,然后输出第k小正整数的值

输出格式

包括若干行,每行一个正整数,表示每个询问的结果

emmmmmm

改题啊在这里(

题目描述

给出含有n个幻想乡少(da)女(ma)的年龄的数组A,有m次操作,操作有两种:修改和询问

修改:修改第i个少女的年龄;

询问:输出数组中第k小的年龄的值。

输入输出格式

输入格式

第一行一个正整数n;

第二行n个正整数,第i个数表示第i个少女的年龄;

第三行一个正整数m;

接下来m行,首先读入一个整数op,

op = 1表示修改,接下来读入两个正整数x,y表示把第i个少女的年龄修改成y

op = 2表示询问,接下来读入一个正整数k,然后输出第k小年龄的值

输出格式

包括若干行,每行一个正整数,表示每个询问的结果

说明

100%:A[i]∈(0,+∞sdfasdfdsgdasfdsgdsfkjhajkewhfkhkfhdkjhfkasjhfsdkfjs

啊那个我也不知道最后怎么了说不定是紫m

不等等我还没把标程题解放上来啊!

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define N 500005
 5 using namespace std;
 6 int t[N*4],n,m,x,y,a[N],op;
 7 int query(int p,int k)
 8 {
 9     int l=1,r=500000,mid;
10     while (l<r)
11     {
12     mid=(l+r)>>1;
13     if (t[2*p]>=k) p=2*p,r=mid;
14     else k-=t[2*p],p=2*p+1,l=mid+1;
15     }
16     return l;
17 }
18 void insert(int p,int x,int y)
19 {
20     int l=1,r=500000,mid;
21     while (l<r)
22     {
23     mid=(l+r)>>1;
24     t[p]+=y;
25     if (x<=mid) p=2*p,r=mid;
26     else p=2*p+1,l=mid+1;
27     }
28     t[p]+=y;
29 }
30 int main()
31 {
32     freopen("kth.in","r",stdin);
33     freopen("kth.out","w",stdout);
34     scanf("%d",&n);
35     for (int i=1;i<=n;i++) scanf("%d",&a[i]),insert(1,a[i],1);
36     scanf("%d",&m);
37     while (m--)
38     {
39         scanf("%d",&op);
40         if (op==2)
41             scanf("%d",&x),printf("%d
",query(1,x));
42         else scanf("%d%d",&x,&y),insert(1,a[x],-1),insert(1,a[x]=y,1);
43     }
44     return 0;
45 }

请不要管我 偷懒 因为我 还没吃饭

原文地址:https://www.cnblogs.com/aristocrat/p/8465799.html