[bzoj3524/2223][Poi2014]Couriers_主席树
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_主席树的更多相关文章
- BZOJ_3524_[Poi2014]Couriers_主席树
BZOJ_3524_[Poi2014]Couriers_主席树 题意:给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r- ...
- 【bzoj3524】[Poi2014]Couriers 主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
- 【BZOJ3524/2223】[Poi2014]Couriers 主席树
[BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...
- [BZOJ2223][BZOJ3524][Poi2014]Couriers 主席树
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2436 Solved: 960[Submit][St ...
- BZOJ3524[Poi2014]Couriers——主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
- BZOJ3524: [Poi2014]Couriers(主席树)
题意 题目链接 Sol 严格众数只会出现一次,那么建出主席树,维护子树siz,直接在树上二分即可 #include<bits/stdc++.h> #define LL long long ...
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- [POI2014] KUR-Couriers (主席树)
[POI2014]KUR-Couriers 题目描述 Byteasar works for the BAJ company, which sells computer games. The BAJ c ...
- 【BZOJ3524】Couriers(主席树)
题意:给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. n,m≤5000 ...
随机推荐
- jsp jquery js 的基本路径获取
引子:js中需要当前页面的基础路径,获取不到request,可以通过如下方法来解决! 1.jsp基础路径,在jsp头部加上,获取基础路径http://localhost:8080/project/ ...
- Linux 下文本查找技巧你掌握了吗?
前言 之前介绍过很多linux下查找相关的命令,例如<Linux中的文件查找技巧>,<find命令高级用法>,<如何查看linux中文件打开情况-lsof命令>等等 ...
- Netty(2) - HelloWorld
Netty:作用场景. 1)Netty可以基于socket实现远程过程调用(RPC). 2)Netty可以基于WebSocket实现长连接. 3)Netty可以实现Http的服务器,类似于Jetty, ...
- MAC应用无法打开或文件损坏的处理方法
在MAC下安装一些软件时提示"来自身份不明开发者",其实这是MAC新系统启用了新的安全机制.默认只信任 Mac App Store 下载的软件和拥有开发者 ID 签名的应用程序.换 ...
- ansible基础知识(二)
软件相关模块 yum yum和rpm的区别 rpm: (Redhat package manager)RPM管理支持事务机制.增强了程序安装卸载的管理. yum: YUM被称为 Yellow dog ...
- 2018.10.9 logstash启动慢的问题解决
问题描述: 线上部署logstash 启动非常缓慢,达到了10分钟 问题解决 忍无可忍 网上资料基本都是熵过低导致jruby启动缓慢的问题,需要安装haveged 参考https://www.jian ...
- fcc html5 css 练习3
行内样式看起来是这样的 <h1 style="color: green"> .pink-text { color: pink !important; } ...
- ionic2/3 禁止屏幕旋转,禁止横屏,竖屏
ionic2/ionic3禁止屏幕旋转,及解除禁止旋转 1.添加插件: cmd到项目目录---> cordova plugin add cordova-plugin-screen-orienta ...
- Ajax——jq中ajax的使用
格式化表单 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- [Windows Server 2008] 安装Apache+PHP+MySQL
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Win2008 ...