codves 2021中庸之道

2021 中庸之道

http://codevs.cn/problem/2021/

题目描述 Description

给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数。

数据保证序列中任意两个数不相同,且询问的所有区间长度为奇数。

输入描述 Input Description

第一行为N,Q。

第二行N个数表示序列。

接下来Q行,每行为L,R,表示一次询问。

输出描述 Output Description

输出Q行,对应每次询问的中位数。

样例输入 Sample Input

5 3

1 4 8 16 2

1 5

3 5

3 3

样例输出 Sample Output

4

8

8

数据范围及提示 Data Size & Hint

40%的数据,N,Q≤100;

70%的数据,N≤100;

100%的数据,N≤1000,Q≤100000,序列中的元素为1到10^9之间的整数。

套上主席树求第K大模板

区间[l,r]中位数转化:k=(r-l)/2+1

例:[5,9]中位数是第7个,k=(9-5)/2+1=3,是第3大

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 100001
using namespace std;
int n,m,l_child[N*18],r_child[N*18],root[N],sum[N*18],tot,id;
int a[N],has[N];
int x,y,k,ans,T;
void build(int pre,int &now,int key,int l,int r)
{
    sum[now=++id]=sum[pre]+1;
    if(l==r) return;
    int mid=(l+r)/2;
    if(key<=mid)
    {
        r_child[now]=r_child[pre];
        build(l_child[pre],l_child[now],key,l,mid);
    }
    else
    {
        l_child[now]=l_child[pre];
        build(r_child[pre],r_child[now],key,mid+1,r);
    }
}
void discrete()
{
    sort(a+1,a+n+1);
    tot=unique(a+1,a+n+1)-(a+1);
    for(int i=1;i<=n;i++) has[i]=lower_bound(a+1,a+tot+1,has[i])-a;
}
int search(int s,int t,int k,int l,int r)
{
    if(l==r) return l;
    int tmp=sum[l_child[t]]-sum[l_child[s]];
    int mid=(l+r)/2;
    if(tmp>=k) return search(l_child[s],l_child[t],k,l,mid);
    else return search(r_child[s],r_child[t],k-tmp,mid+1,r);
}
int main()
{
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]),has[i]=a[i];
        discrete();
        for(int i=1;i<=n;i++) build(root[i-1],root[i],has[i],1,tot);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            k=(y-x)/2+1;//转化
            ans=search(root[x-1],root[y],k,1,tot);
            printf("%d\n",a[ans]);
        }
}
时间: 2024-12-15 12:16:02

codves 2021中庸之道的相关文章

codevs 2021 中庸之道

所谓[l,r]的中位数?就是区间第(r-l+2)大. 主席树乱搞之. #include<iostream>#include<cstdio>#include<algorithm>#include<vector>#define maxn 1005using namespace std;int num[maxn],hash[maxn],n,q,tot=0,a,b,c;int ls[maxn*20],rs[maxn*20],sum[maxn*20],root[max

CODEVS 2021中庸之道

题目描述 Description 给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数. 数据保证序列中任意两个数不相同,且询问的所有区间长度为奇数. 输入描述 Input Description 第一行为N,Q. 第二行N个数表示序列. 接下来Q行,每行为L,R,表示一次询问. 输出描述 Output Description 输出Q行,对应每次询问的中位数. 样例输入 Sample Input 5 3 1 4 8 16 2 1 5 3 5 3 3 样例输出 Sample Outp

AC日记——中庸之道 codevs 2021

2021 中庸之道 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数. 数据保证序列中任意两个数不相同,且询问的所有区间长度为奇数. 输入描述 Input Description 第一行为N,Q. 第二行N个数表示序列. 接下来Q行,每行为L,R,表示一次询问. 输出描述 Output Description 输出Q行,对应每次询问的中位

中庸之道(codevs 2021)

题目描述 Description 给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数. 数据保证序列中任意两个数不相同,且询问的所有区间长度为奇数. 输入描述 Input Description 第一行为N,Q. 第二行N个数表示序列. 接下来Q行,每行为L,R,表示一次询问. 输出描述 Output Description 输出Q行,对应每次询问的中位数. 样例输入 Sample Input 5 3 1 4 8 16 2 1 5 3 5 3 3 样例输出 Sample Outp

通过“中庸之道”剖析互联网思维的运营框架

历史上是这样去评价<论语>的,半本<论语>治天下,可见"孔子曰"的内涵价值之高,孔子作为儒家思想的创始人. 他是以中庸之道作为为人处世标准,以"天人合一"作为理论基础,诠释中庸者为王. 伟大思想家的思想,单从字面上去理解,我们是无法真正完全领悟的. 今天我就卖弄一下个人应用在于创业的理解吧,我们拿电路系统来理解吧,电路系统里面有两极,那就是正极和负极:电路系统的输入有正负极之分,输出也有正负极之分; 从总开关到每一个小零件都需要正负极相通,不

中庸之道相当于平衡学,做好人就能创好业

我公众号前面的文章分享谈到,儒家思想的中庸之道,个人觉得,在创业的领域中,中庸之道可以作为一个创业的工具. 因为中庸之道的工具属性相当于平衡学的原理,是处于两个极端中间的,就是哪里出现问题,出现下滑,我们就往哪里出力,使其平衡. 中庸之道应用到社交上,两个个性非常强的人如果经常在一起,谁都不愿服输,如果这中间没有什么可以协调他们的话,最终就有一方彻底输的,那这中间需要什么协调呢? 有可能其中一个人重感情,认为输赢比彼此的感情重要,那么就能平息事态的恶化. 有可能是是利益关系,比如其中一个人的利益

ural 2021 Scarily interesting!

2021. Scarily interesting! Time limit: 1.0 secondMemory limit: 64 MB This year at Monsters University it is decided to arrange Scare Games. At the Games all campus gathers at the stadium stands, and the Scare program students divide into two teams to

codves 3044 矩形面积求并

codves  3044 矩形面积求并  题目等级 : 钻石 Diamond 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行一个数n,表示矩形个数(n<=100) 接下来n行每行4个实数x1,y1,x2,y1(0 <= x1 < x2 <= 100000;0 <= y1 < y2 <= 100000),表示矩形的

hdu 2021 发工资咯:)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2021 题目大意:给老师发工资,找出最少的人民币张数. 1 #include <stdio.h> 2 int main () 3 { 4 int a,n,i,sum; 5 while (scanf("%d",&n),n) 6 { 7 sum=0; 8 for (i=1; i<=n; i++) 9 { 10 scanf ("%d",&a);