Couriers bzoj-3524 Poi-2014

题目大意:给定n个数的序列,询问区间内是否存在一个在区间内至少出现了(区间长度>>1)次的数。如果有,输出该数,反之输出0。

注释:$1\le n,m\le 5\cdot 10^5$。


想法:主席树裸题。

主流做法就是弄一个Existence数组询问有没有这样的数,然后查询区间中位数即可。

但是可以在query的时候强行查询,因为没有输出0,直接输出即可。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 500010
using namespace std;
int cnt[N<<5],ls[N<<5],rs[N<<5],tot;
int a[N],b[N],root[N];
int build(int l,int r)
{
int pos=++tot,mid=(l+r)>>1;
if(l==r) return pos;
ls[pos]=build(l,mid); rs[pos]=build(mid+1,r);
return pos;
}
int update(int pre,int l,int r,int k)
{
int pos=++tot,mid=(l+r)>>1;
cnt[pos]=cnt[pre]+1;
ls[pos]=ls[pre]; rs[pos]=rs[pre];
if(l==r) return pos;
if(k<=mid) ls[pos]=update(ls[pre],l,mid,k);
else rs[pos]=update(rs[pre],mid+1,r,k);
return pos;
}
// bool Existence(int x,int y,int l,int r,int Want)
// {
// if(l==r) return (cnt[y]-cnt[x])>=Want;
// int mid=(l+r)>>1;
// int LR=1;
// if(cnt[ls[y]]-cnt[ls[x]]>cnt[rs[y]]-cnt[rs[x]]) LR=0;
// else if(cnt[ls[y]]-cnt[ls[x]]<cnt[rs[y]]-cnt[rs[x]]) LR=2;
// if(LR==0) return Existence(ls[x],ls[y],l,mid,Want);
// if(LR==2) return Existence(rs[x],rs[y],mid+1,r,Want);
// return Existence(ls[x],ls[y],l,mid,Want)|Existence(rs[x],rs[y],mid+1,r,Want);
// }
// int query(int x,int y,int l,int r,int k)
// {
// int mid=(l+r)>>1;
// if(l==r) return b[l];
// int dlt=cnt[ls[y]]-cnt[ls[x]];
// if(dlt>=k) return query(ls[x],ls[y],l,mid,k);
// else return query(rs[x],rs[y],mid+1,r,k-dlt);
// }
int query(int x,int y,int l,int r,int k)
{
int mid=(l+r)>>1;
if(l==r) return l;
int L=cnt[ls[y]]-cnt[ls[x]],R=cnt[rs[y]]-cnt[rs[x]];
if(L>k) return query(ls[x],ls[y],l,mid,k);
if(R>k) return query(rs[x],rs[y],mid+1,r,k);
else return 0;
}
int main()
{
int n,m; cin >> n >> m ;
for(int i=1;i<=n;i++) scanf("%d",&a[i])/* ,b[i]=a[i] */;
sort(b+1,b+n+1); /* int len=unique(b+1,b+n+1)-b-1; */
root[0]=build(1,n);
for(int i=1;i<=n;i++)
{
// int t=lower_bound(b+1,b+n+1,a[i])-b;
root[i]=update(root[i-1],1,n,a[i]);
}
for(int x,y,i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
// if(Existence(root[x-1],root[y],1,n,(y-x+1)/2+1)) printf("%d\n",query(root[x-1],root[y],1,n,(y-x+1)/2+1));
// else printf("0\n");
printf("%d\n",query(root[x-1],root[y],1,n,(y-x+1)>>1));
}
return 0;
}

小结:主席树真强... ...

[bzoj3524/2223][Poi2014]Couriers_主席树的更多相关文章

  1. BZOJ_3524_[Poi2014]Couriers_主席树

    BZOJ_3524_[Poi2014]Couriers_主席树 题意:给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r- ...

  2. 【bzoj3524】[Poi2014]Couriers 主席树

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

  3. 【BZOJ3524/2223】[Poi2014]Couriers 主席树

    [BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...

  4. [BZOJ2223][BZOJ3524][Poi2014]Couriers 主席树

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

  5. BZOJ3524[Poi2014]Couriers——主席树

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

  6. BZOJ3524: [Poi2014]Couriers(主席树)

    题意 题目链接 Sol 严格众数只会出现一次,那么建出主席树,维护子树siz,直接在树上二分即可 #include<bits/stdc++.h> #define LL long long ...

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

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

  8. [POI2014] KUR-Couriers (主席树)

    [POI2014]KUR-Couriers 题目描述 Byteasar works for the BAJ company, which sells computer games. The BAJ c ...

  9. 【BZOJ3524】Couriers(主席树)

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

随机推荐

  1. 常用进制的转换、进制数的and与or或xor异或运算

    [十进制转换成其他进制]例:将25转换为二进制数 解: 25÷2=12 余数1  12÷2=6   余数0  6÷2=3     余数0  3÷2=1     余数1  1÷2=0     余数1 所 ...

  2. PCB SQL Server 代码创建DbLink

    代码如下: ) ) ) ) ) SET @serverName = 'DbLinkName' --db链接名 SET @ip = '120.79.36.65' --需连接服务器的IP SET @dbN ...

  3. Django基于JWT实现微信小程序的登录和鉴权

    什么是JWT? JWT,全称Json Web Token,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它是数字签名的. 与Session的区别 一.Session是在服务 ...

  4. 聪明的kk --- 搜索超时

    二话没说上去搜索 , 果不其然 华丽超时 . #include<stdio.h> #include<string.h> #include<math.h> #incl ...

  5. printf的字符型

    参  数 说  明 %s 按实际宽度输出一个字符串 %ms m指定宽度(不足时左补空格,大于时按实际宽度输出) %-ms 左对齐,不足时右补空格 %m.ns 输出占m个字符位置,其中字符数最多n个,左 ...

  6. 为什么选择Android Studio 而是 Eclipse

    Android Studio 现在的版本已经比较稳定了,刚出来时也是各种BUG,自己用了下,摸索了一天,感觉挺好的. 优点之一:代码提示和搜索功能非常强大,非常智能. 1).自定义theme有个名字叫 ...

  7. Unity相机平滑跟随

    简介 unity中经常会用到固定视角的相机跟随,然后百度发现大家都是自己写的,然后偶也写咯一个,分享一下 PS: 由于刚学C#不久,才发现delegate这个东东,也不知道对性能影响大不大,但是看MS ...

  8. Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼

    Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼标签: winform treeview drawnode Treeview控 ...

  9. HTML CSS, JavaScript 计算器

    效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  10. html5——动画

    基本介绍 /*执行函数gun,执行时间,重复执行,反向执行,匀速执行,延迟执行时间*/ animation: gun 4s infinite alternate linear 5s; 动画序列 1.g ...