BZOJ 3524 [Poi2014]Couriers 主席树

2024-03-30 16:58

本文主要是介绍BZOJ 3524 [Poi2014]Couriers 主席树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

给一个长度为n的序列a。1≤a[i]≤n。
m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。如果存在,输出这个数,否则输出0。

Input

第一行两个数n,m。
第二行n个数,a[i]。
接下来m行,每行两个数l,r,表示询问[l,r]这个区间。

Output

m行,每行对应一个答案。

Sample Input

7 5
1 1 3 2 3 4 3
1 3
1 4
3 7
1 7
6 6

Sample Output

1
0
3
0
4

HINT

【数据范围】

n,m≤500000


2016.7.9重设空间,但未重测!




传送门

AC 100 纪念!(蒟蒻)

撒花撒花~~~~~



其实主席树好像就是可持久化线段树??(唔)

主席树(Chair Tree)是把n棵线段树,从O(N^2)的空间优化到了O(NlogN)

因为这n棵函数式线段树(权值线段树)的结构都是一致的,

以及一些特点,我们就可以优化了。

记得有个有图的教程似乎不错看看图就可以懂了的吧……


这题:

其实题意就是找m个区间的众数。

那么一个众数出现次数就是在区间长度一半以上;

通过构建一棵主席树,我们可以用前缀和的思想搞出区间内一段连续数字的总出现次数。

事实上,我们只要沿着出现次数比一半大的方向不停往下找,就可以找到了;

当然如果不存在,那么就是下面的两个儿子的值都比区间一半小。

所以可以称是主席树的入门题目了吧……



双倍经验BZOJ 2223



#include<bits/stdc++.h>
using namespace std;
int read(){int x=0,f=1;char ch=getchar();while (ch<'0' || ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
const int N=500005,logN=25;
int n,m,Tcnt;
int root[N];
struct ChairTree{int l,r,num;
}ct[N*logN];
void insert(int L,int R,int &x,int val){ct[Tcnt++]=ct[x];x=Tcnt-1;ct[x].num++;if (L==R) return;int mid=(L+R)>>1;if (val<=mid) insert(L,mid,ct[x].l,val);else insert(mid+1,R,ct[x].r,val);
}
int query(int L,int R,int ll,int rr,int g){if (L==R) return L;int mid=(L+R)>>1,t1=ct[ct[rr].l].num-ct[ct[ll].l].num,t2=ct[ct[rr].r].num-ct[ct[ll].r].num;if (t1>g) return query(L,mid,ct[ll].l,ct[rr].l,g); elseif (t2>g) return query(mid+1,R,ct[ll].r,ct[rr].r,g);else return 0;
}
int main(){n=read(),m=read();root[0]=0,Tcnt=1;for (int i=1;i<=n;i++)root[i]=root[i-1],insert(1,n,root[i],read());int x,y;while (m--){x=read(),y=read();printf("%d\n",query(1,n,root[x-1],root[y],(y-x+1)>>1));}return 0;
}

这篇关于BZOJ 3524 [Poi2014]Couriers 主席树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862054

相关文章

【POJ】2104 K-th Number 静态第K小——主席树

传送门:【POJ】2104 K-th Number 题目分析: 哇咔咔,又get了一个新技能——主席树,初步学习主席树,一次AC,感觉好棒~ 也在此Orz一下发明者主席——fotile96,在叉姐群经常看到主席的身影,不过蒟蒻也只能仰望神犇的背影了,起步迟且天赋不如人,只能慢慢的走下去,希望有一天能看到另一个世界。 主席树的编程方式是函数式编程(可持久化),保证我们可以查询历史

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

BZOJ 2038 小Z的袜子(hose) (莫队离线)

题目地址:BZOJ 2038 裸的莫队算法。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#in

BZOJ 2152 聪聪可可 (树上点分治)

题目地址:BZOJ 2152 找有多少对权值和为3的倍数的点。最简单的点分治。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#incl

BZOJ 3530 数数【AC自动机+数位dp】

[Sdoi2014]数数 简单数位dp+简单AC自动机 反正数位DP是队友写的 AC自动机要记录两个值,一个是是否为一个串的结束,即不合法状态,一个是前缀零的情况。 // whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostr

BZOJ 3531 旅行【树链剖分】

[Sdoi2014] 简单的树链剖分 以每个信仰应该建一个线段树,空间复杂度为 O(5×1010) O(5\times 10^{10}) 因此会爆空间,所以需要动态申请空间。 // whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <