题意:

给出一个长度为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. Java.HttpClient绕过Https证书解决方案二

    方案2 import java.io.*; import java.net.URL; import java.net.URLConnection; import java.security.Secur ...

  2. Django之ORM的增删改查操作流程

    总结:ORM的 查.增.删.改 - 查 - client - 有一个展示页面(xxx_show.html) - 这一个页面一输入执行后,get请求向server端发送 - 这个展示页面有添加按钮.删除 ...

  3. Spring 整合 Redis (零配置) 的简单使用

    pom.xml <!--jedis--> <dependency> <groupId>redis.clients</groupId> <artif ...

  4. Django学习案例一(blog):三. 模型生成数据

    1. 什么是模型models Django中以创建类的形式来创建数据表. 在编写代码的过程中,所有对数据库的操作,都是对类和类的对象进行操作. ORM对象关系映射(Object relation ma ...

  5. 书不在多,精读则灵 - Oracle入门书籍推荐

      作者:eygle |English [转载时请标明出处和作者信息]|[恩墨学院 OCM培训传DBA成功之道]链接:http://www.eygle.com/archives/2006/08/ora ...

  6. 闰年or平年判断

    <script type="text/javascript">var year = prompt("请输入一个年份");if(year!=null) ...

  7. 本博客基本不再更新,请移步至我的CSDN博客

    本博客基本不再更新,请移步至我的CSDN博客:http://blog.csdn.net/wpxu08

  8. EMC VNX5200/5400存储 新增LUN与Hosts映射操作

    EMC VNX5200/5400 1.创建RAID  Groups 1.1        进入EMC VNX5200/5400主界面,依次选择Storage——Storage Pools——RAID ...

  9. Java设计模式之JDK动态代理原理

    动态代理核心源码实现public Object getProxy() { //jdk 动态代理的使用方式 return Proxy.newProxyInstance( this.getClass(). ...

  10. PHP并发IO编程实践

    PHP相关扩展 Stream:PHP内核提供的socket封装 Sockets:对底层Socket API的封装 Libevent:对libevent库的封装 Event:基于Libevent更高级的 ...