[bzoj3524][Couriers]
思路
观察这个\((r - l + 1)/2\),很容易证明,如果一个数出现次数大于\((r - l + 1) / 2\),那么这个区间内第\((r - l + 1) / 2 + 1\)大一定是这个数。所以只要用主席树查询出区间内第\((r - l + 1) / 2 + 1\)大,然后再去查这个数在这个区间内出现次数,就行了。
代码
/*
* @Author: wxyww
* @Date: 2018-12-11 16:59:21
* @Last Modified time: 2018-12-11 17:12:03
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long ll;
const int N = 500000 + 100;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int tree[N * 30],ls[N * 30],rs[N * 30];
int a[N],root[N],tot;
void update(int &rt,int lst,int l,int r,int pos) {
rt = ++tot;
ls[rt] = ls[lst];rs[rt] = rs[lst];
tree[rt] = tree[lst] + 1;
if(l == r) return;
int mid = (l + r) >> 1;
if(pos <= mid) update(ls[rt],ls[lst],l,mid,pos);
else update(rs[rt],rs[lst],mid + 1,r,pos);
}
int kth(int L,int R,int l,int r,int k) {
int z = tree[ls[R]] - tree[ls[L]];
if(l == r) return l;
int mid = (l + r) >> 1;
if(k <= z) return kth(ls[L],ls[R],l,mid,k);
else return kth(rs[L],rs[R],mid + 1,r,k - z);
}
int query(int rt,int l,int r,int pos) {
if(l == r) return tree[rt];
int mid = (l + r) >> 1;
if(pos <= mid) return query(ls[rt],l,mid,pos);
else return query(rs[rt],mid + 1,r,pos);
}
int main() {
int n = read(),m = read();
for(int i = 1;i <= n;++i) update(root[i],root[i - 1],1,n,read());
while(m--) {
int l = read(),r = read();
int k = kth(root[l - 1],root[r],1,n,(r - l + 1) / 2 + 1);
int z = query(root[r],1,n,k) - query(root[l - 1],1,n,k);
if(z > (r - l + 1) / 2) printf("%d\n",k);
else puts("0");
}
return 0;
}
[bzoj3524][Couriers]的更多相关文章
- BZOJ-3524 Couriers 可持久化线段树
可持久化线段树,其实就是类主席树了.. 3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1124 Sol ...
- bzoj-3524 Couriers
题意: 给出一个长度为n的序列和m次询问. 每次询问给出区间[l,r],求区间中出现次数大于(r-l+1)/2的数字. n.m<=500000.1<=每一个数字<=n: 题解: 主席 ...
- 【BZOJ3524/2223】[Poi2014]Couriers 主席树
[BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...
- C++之路进阶——bzoj3524(Couriers)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser gryz2016 Logout 捐赠本站 Notice:由于本OJ ...
- bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI
题目链接1 题目链接2 主席树模板题 两题有细节不同 #include<algorithm> #include<iostream> #include<cstdlib> ...
- [bzoj3524==bzoj2223][Poi2014]Couriers/[Coci 2009]PATULJCI——主席树+权值线段树
题目大意 给定一个大小为n,每个数的大小均在[1,c]之间的数列,你需要回答m个询问,其中第i个询问形如\((l_i, r_i)\),你需要回答是否存在一个数使得它在区间\([l_i,r_i]\)中出 ...
- [BZOJ2223][BZOJ3524][Poi2014]Couriers 主席树
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2436 Solved: 960[Submit][St ...
- 【BZOJ3524】Couriers(主席树)
题意:给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. n,m≤5000 ...
- Bzoj3524 [Poi2014]Couriers
Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0 ...
随机推荐
- 创建虚拟目录失败,必须为服务器名称指定“localhost”
关于微信开发过程,远程调试后,再次打开vs出现项目加载失败的解决办法! 第一步: 第二步:打开编辑的页面,把下图这部分直接注释掉 ok了,再加载一次,就好了!
- 剑指offer(12)
来两道关于链表链接的题目: 题目一: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 本题要考虑到其中一条链表是空或者两个都是空的情况. 在每个链表安上一 ...
- socket基础编程-2
client端: import socket while True: client=socket.socket(socket.ANET,socket.SOCK_STREAM) client.conne ...
- python之路--关于线程的一些方法
一 . 线程的两种创建方式 from threading import Thread # 第一种创建方式 def f1(n): print('%s号线程任务'%n) def f2(n): print( ...
- python之路--FTP 上传视频示例
# 服务端 import json import socket import struct server = socket.socket() server.bind(('127.0.0.1',8001 ...
- StringBuilder与String有哪些区别?
System.String具备不可修改性,在程序中这样的特性容易产生性能上的问题.针对这个问题.NET提供的StringBuilder类可以解决类似的问题. String 和 StringBuilde ...
- mysql “Too many connections” 解决办法
今天生产服务器上的MySQL出现了一个不算太陌生的错误“Too many connections”.平常碰到这个问题,我基本上是修改/etc/my.cnf的max_connections参数,然后重启 ...
- iis7.0 发生未知 FastCGI错误,错误代码 0x8007010b 的解决办法
错误提示 修改该网站所对应的应用程序池 进程模型->标识 修改为:LocalSystem
- LODOOP中的各种边距 打印项、整体偏移、可打区域、内部边距
Lodop中的打印项内容位置定位,除了打印项本身的top,left值,也会受其他设定或打印机的影响.打印开发,先用虚拟打印机测试出正确结果,然后客户端用打印维护微调常见问题:1.设置打印项相对于纸张居 ...
- 前端base64、baseurl加解密和RSA加解密
由于项目最近要进行安全测试,前端的用户和密码都是明文数据传送给后台那里,其实这样很很不安全的,容易泄露个人信息和密码.中间服务器的同事就提出,可以通过前端接收公钥,利用公钥对密码进行加密,把加密过密码 ...