bzoj3524 bzoj2223
bzoj3524这是我主席树的第一题
什么是主席树呢,就是n棵线段树,每棵线段树记录前缀每个数值(显然想到里离散化)出现次数
由于第i棵树相对于第i-1棵树只有logS个点不同(S为数值的种类数)
所以总的空间复杂度为O(nlogS),非常好理解;
由于每棵线段树的形态都是一样的,所以这些线段树是可以做减法的,
这是一个非常有用的性质,也很好的解决了区间的性质
然后解决这道题,这题问区间出现次数超过(r-l+1)/2的数,显然直接顺着主席树搜就可以了logS的复杂度
bzoj2223基本同样的题目,注意样例n后面多了个ai的范围
type node=record
l,r,s:longint;
end; var tree:array[..] of node;
sum,head,a,b,rank,sa:array[..] of longint;
x,y,i,n,m,t,len,p:longint; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure sort(l,r: longint);
var i,j,x: longint;
begin
i:=l;
j:=r;
x:=a[(l+r) shr ];
repeat
while a[i]<x do inc(i);
while x<a[j] do dec(j);
if not(i>j) then
begin
swap(a[i],a[j]);
swap(b[i],b[j]);
inc(i);
j:=j-;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; procedure update(x:longint);
begin
tree[x].s:=tree[tree[x].l].s+tree[tree[x].r].s;
end; function build(l,r:longint):longint;
var m,q:longint;
begin
inc(t);
q:=t;
if l=r then exit(t)
else begin
m:=(l+r) shr ;
tree[q].l:=build(l,m);
tree[q].r:=build(m+,r);
end;
exit(q);
end; function pre(w,l,r:longint):longint;
var m,q:longint;
begin
inc(t);
q:=t;
if l=r then
tree[t].s:=sum[l]
else begin
m:=(l+r) shr ;
if rank[i]<=m then
begin
tree[q].l:=pre(tree[w].l,l,m);
tree[q].r:=tree[w].r;
end
else begin
tree[q].l:=tree[w].l;
tree[q].r:=pre(tree[w].r,m+,r);
end;
update(q);
end;
exit(q);
end; function ask(x,y,l,r:longint):longint;
var m,a,b:longint;
begin
if l=r then
begin
if tree[y].s-tree[x].s>len then
exit(sa[l])
else exit();
end
else begin
m:=(l+r) shr ;
if tree[y].s-tree[x].s<=len then exit();
a:=tree[x].l;
b:=tree[y].l;
if tree[b].s-tree[a].s>len then exit(ask(a,b,l,m));
a:=tree[x].r;
b:=tree[y].r;
if tree[b].s-tree[a].s>len then exit(ask(a,b,m+,r));
exit();
end;
end; begin
readln(n,m);
for i:= to n do
begin
read(a[i]);
b[i]:=i;
end;
sort(,n);
p:=;
rank[b[]]:=;
sa[]:=a[];
for i:= to n do
begin
if a[i]<>a[i-] then
begin
inc(p);
sa[p]:=a[i];
end;
rank[b[i]]:=p;
end;
t:=;
head[]:=build(,p);
for i:= to n do
begin
inc(sum[rank[i]]);
head[i]:=pre(head[i-],,p);
end;
for i:= to m do
begin
readln(x,y);
len:=(y-x+) shr ;
writeln(ask(head[x-],head[y],,p));
end;
end.
bzoj3524 bzoj2223的更多相关文章
- [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/2223】[Poi2014]Couriers 主席树
[BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...
- bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI
题目链接1 题目链接2 主席树模板题 两题有细节不同 #include<algorithm> #include<iostream> #include<cstdlib> ...
- 2018.09.30 bzoj2223: [Coci 2009]PATULJCI(主席树)
传送门 主席树经典题目. 直接利用主席树差分的思想判断区间中数的个数是否合法然后决定左走右走就行了. 实际上跟bzoj3524是同一道题. 代码: #include<bits/stdc++.h& ...
- BZOJ3524 & LOJ2432:[POI2014]代理商Couriers——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3524 https://loj.ac/problem/2432 给一个长度为n的序列a.1≤a[i] ...
- 【bzoj3524】[Poi2014]Couriers 主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
- 【BZOJ3524】Couriers(主席树)
题意:给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. n,m≤5000 ...
- [bzoj3524/2223][Poi2014]Couriers_主席树
Couriers bzoj-3524 Poi-2014 题目大意:给定n个数的序列,询问区间内是否存在一个在区间内至少出现了(区间长度>>1)次的数.如果有,输出该数,反之输出0. 注释: ...
随机推荐
- EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
EqualsBuilder和HashCodeBuilder 自动化hashCode()和equals() 问题产生:当需要自动实现hashCode()和equals()方法 解决方法:使用Equa ...
- Xcode8 Could not build Objective-C module 'FBSDKCoreKit'
解决方法是: 删除/Users/Rinpe/Library/Developer/Xcode/DerivedData下对应的文件夹即可.
- Codevs 1690 开关灯 USACO
1690 开关灯 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description YYX家门前的街上有N(2<=N& ...
- bzoj3351:[ioi2009]Regions
思路:首先如果颜色相同直接利用以前的答案即可,可以离线排序或是在线hash,然后考虑怎么快速统计答案. 首先如果点a是点b的祖先,那么一定有点b在以点a为根的子树的dfs序区间内的,于是先搞出dfs序 ...
- IDE开发<LER-Studio>(2)::登录模块
软件中写登录模块是为了防止软件的恶意传播,内测阶段可以忽略登录. 以下为登录模块主要源代码: void CLoginDlg::OnBnClickedBtnLogin() { // TODO: Add ...
- WebRTC 音视频开发之路
早在2014年就通过WebRTC实现了PC客户端的实时视频语音,那时P2P连接的建立使用的WebRTC自带的libjingle库,使用peerconnection的API实现的.后来在做远程桌面,文件 ...
- 九度OJ 1042 Coincidence -- 动态规划(最长公共子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1042 题目描述: Find a longest common subsequence of two strings ...
- 配置trac
1. enable apache mod_auth_digest 2. 设置Location
- 配置apache+trac环境
按照trac官网上的配置始终通不过.仔细看了,原来我们使用的apache版本是2.4的,在2.4中有些directive已经变了. 例如:原来的 Allow from all 现在变成了 Requir ...
- vi简单快键命令
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...