题意:

给出一个长度为n的序列和m次询问。

每次询问给出区间[l,r],求区间中出现次数大于(r-l+1)/2的数字。

n。m<=500000。1<=每一个数字<=n;

题解:

主席树的算是裸题吧,静态序列不用套树状数组,数据范围也省了离散化;

直接上主席树就能够了,复杂度就是O((n+m)logn)的样子;

空间略爆炸。可是假设取消Build()函数就能够过了。

orz icebound神犇,搞了一种奇妙的建树法:

void Insert(int l,int r,int &now,int val)
{
a[++cnt]=a[now];
now=cnt,a[now].sum++;
if(l==r) return ;
int mid=l+r>>1;
if(val<=mid) Insert(l,mid,a[now].l,val);
else Insert(mid+1,r,a[now].r,val);
}

这个姿势是不须要提前建空树的,省了2*n的空间;

比較巧妙的就是传地址之后复制结点。再把地址赋值,使新版本号的树独立出来;

所以仅仅须要四个參数就能够了,编程复杂度也非常低;

(我似乎讲的不太明确,yy一下代码就好了)

然后查询啥的搞搞推断也是logn级别,时间上不怎么卡就过了;

bzoj-2223同题。然而不仅数据范围小内存还大了一倍= =;

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 510000
using namespace std;
struct node
{
int l,r,sum;
}a[N*20];
int root[N],cnt;
void Build(int l,int r,int &no)
{
if(!no) no=++cnt;
if(l==r) return ;
int mid=l+r>>1;
Build(l,mid,a[no].l);
Build(mid+1,r,a[no].r);
}
void Insert(int l,int r,int &now,int val)
{
a[++cnt]=a[now];
now=cnt,a[now].sum++;
if(l==r) return ;
int mid=l+r>>1;
if(val<=mid) Insert(l,mid,a[now].l,val);
else Insert(mid+1,r,a[now].r,val);
}
int query(int l,int r,int nol,int nor,int val)
{
if(l==r) return l;
int mid=l+r>>1;
if(a[a[nor].l].sum-a[a[nol].l].sum>val)
return query(l,mid,a[nol].l,a[nor].l,val);
else if(a[a[nor].r].sum-a[a[nol].r].sum>val)
return query(mid+1,r,a[nol].r,a[nor].r,val);
else
return 0;
}
int main()
{
int n,m,i,j,k,x,l,r;
scanf("%d%d",&n,&m);
// Build(1,n,root[0]);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
root[i]=root[i-1];
Insert(1,n,root[i],x);
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
printf("%d\n",query(1,n,root[l-1],root[r],r-l+1>>1));
}
return 0;
}

bzoj-3524 Couriers的更多相关文章

  1. BZOJ 3524 Couriers | 主席树

    BZOJ 3524 Couriers 题意 求一个区间内出现超过区间长度的一半的数,如果没有则输出0. 题解 我可能太菜了吧--这道题愣是没想出来-- 维护权值主席树,记录每个数都出现过多少次: 查询 ...

  2. 洛谷 3567/BZOJ 3524 Couriers

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2895  Solved: 1189[Submit][S ...

  3. 主席树||可持久化线段树||BZOJ 3524: [Poi2014]Couriers||BZOJ 2223: [Coci 2009]PATULJCI||Luogu P3567 [POI2014]KUR-Couriers

    题目:[POI2014]KUR-Couriers 题解: 要求出现次数大于(R-L+1)/2的数,这样的数最多只有一个.我们对序列做主席树,每个节点记录出现的次数和(sum).(这里忽略版本差值问题) ...

  4. BZOJ 3524: [Poi2014]Couriers [主席树]

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1892  Solved: 683[Submit][St ...

  5. BZOJ 3524: [Poi2014]Couriers

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1905  Solved: 691[Submit][St ...

  6. BZOJ 3524 [Poi2014]Couriers(二分+蒙特卡罗)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...

  7. BZOJ 3524 [Poi2014]Couriers(可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...

  8. 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树

    为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...

  9. 【bzoj 3524】[Poi2014]Couriers

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

  10. 【刷题】BZOJ 3524 [Poi2014]Couriers

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

随机推荐

  1. 练习2 及pl/sql

    Rownum 如果不是对主键排序是不会变得 -查询没有学分的学生信息 --SELECT * FROM z_student zs WHERE zs.code NOT IN (SELECT DISTINC ...

  2. 在linux服务器centos上使用svn同步代码到项目中

    一.需求 1.在多人开发过程中代码的管理以及版本的控制是一个很重要的问题,因为在开发过程中我们可能会同时更改过某个文件或者更改过多个文件, 这会导致我们很容易发生错误.所以我们需要一个方式去管理我们的 ...

  3. python 10:len(list)(获取列表长度)以及负访问性

    bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(len(bicycles)) #获取某列表长度,即列表元素个数 pr ...

  4. Cracking the Coding Interview 10.7

    Design an algorithm to find the kth number such that the only prime factors are 3,5 and 7 方法一: a[i]= ...

  5. 深入理解Redis(番外)——持久化

    引语 Redis作为一款内存数据库,自然所有数据都加载在内存中,那么自然就有小伙伴会问,如果服务器宕机了怎么办,数据不都丢了吗,不用担心,Redis早就提供了两种方式来将数据进行持久化,即便服务器宕机 ...

  6. POJ 2823 线段树 Or 单调队列

    时限12s! 所以我用了线段树的黑暗做法,其实正解是用单调队列来做的. //By SiriusRen #include <cstdio> #include <cstring> ...

  7. java selenium启动火狐浏览器报错:Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: VISTA Build info: version: '3.8.1', revision: '6e95a6684b', time: '2017-12-01T19:05:14.666Z

    Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: VISTA Build in ...

  8. Cloudera Manager安装之利用parcels方式(在线或离线)安装单节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(Ubuntu14.04)(四)

    .. 欢迎大家,加入我的微信公众号:大数据躺过的坑     免费给分享       同时,大家可以关注我的个人博客:  http://www.cnblogs.com/zlslch/   和  http ...

  9. angularJS之ng-bind与{{}}取值的区别

    1:{{ }} 是等页面加载完后,再取值. 2:ng-bind 它是在页面加载的时候,是不会显示{{name}}这种变量出来. 3:ng-bind 可以解决 ng 页面闪烁加载问题. 4:ng-bin ...

  10. js视频学习笔记1

    1:数组赋值的个数长度定义无效,第4个存储的数还是能原封不动打印出来. js的数组是内部有一个变量名叫0,它的值是1,有一变量名叫1,它的值是2.是这样表示的 2:js是弱类型语言,没有var标识符, ...