[POI2014] KUR-Couriers (主席树)
[POI2014]KUR-Couriers
题目描述
Byteasar works for the BAJ company, which sells computer games.
The BAJ company cooperates with many courier companies that deliver the games sold by the BAJ company to its customers.
Byteasar is inspecting the cooperation of the BAJ company with the couriers.
He has a log of successive packages with the courier company that made the delivery specified for each package.
He wants to make sure that no courier company had an unfair advantage over the others.
If a given courier company delivered more than half of all packages sent in some period of time, we say that it dominated in that period.
Byteasar wants to find out which courier companies dominated in certain periods of time, if any.
Help Byteasar out!
Write a program that determines a dominating courier company or that there was none.
给一个数列,每次询问一个区间内有没有一个数出现次数超过一半,没有这种数输出0
输入输出格式
输入格式:
The first line of the standard input contains two integers,
and
(
), separated by a single space, that are the number of packages shipped by the BAJ company and the number of time periods for which the dominating courier is to be determined, respectively.
The courier companies are numbered from
to (at most)
.
The second line of input contains
integers,
(
), separated by single spaces;
is the number of the courier company that delivered the
-th package (in shipment chronology).
The
lines that follow specify the time period queries, one per line.
Each query is specified by two integers,
and
(
), separated by a single space.
These mean that the courier company dominating in the period between the shipments of the
-th and the
-th package, including those, is to be determined.
In tests worth
of total score, the condition
holds, and in tests worth
of total score
.
输出格式:
The answers to successive queries should be printed to the standard output, one per line.
(Thus a total of
lines should be printed.) Each line should hold a single integer: the number of the courier company that dominated in the corresponding time period, or
if there was no such company.
输入输出样例
输入样例#1:
7 5
1 1 3 2 3 4 3
1 3
1 4
3 7
1 7
6 6
输出样例#1:
1
0
3
0
4
说明
给一个数列,每次询问一个区间内有没有一个数出现次数超过一半
Solution
前置技能:
主席树
主席树学习传送门
对原序列建主席树,对于一段区间,我们先尝试左子树是否可以满足条件,再查右子树,如果都不能就返回0
其实如果会主席树,这道题挺显然的
Code
#include<bits/stdc++.h>
#define in(i) (i=read())
#define il extern inline
#define rg register
#define mid ((l+r)>>1)
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define lol long long
using namespace std;
const lol N=1e6+10;
lol read() {
lol ans=0, f=1; char i=getchar();
while (i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
while (i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+(i^48), i=getchar();
return ans*f;
}
int n,m,tot,num;
int a[N],b[N],rt[N<<6];
struct Chair_Tree {
int l,r,v;
}t[N<<6];
void build(int &u,int l,int r) {
u=++tot;
if(l==r) {t[u].v=a[l]; return;}
build(t[u].l,l,mid);
build(t[u].r,mid+1,r);
}
void insert(int &u,int l,int r,int pre,int p) {
t[u=++tot]=t[pre]; t[u].v++;
if(l==r) return;
if(p<=mid) insert(t[u].l,l,mid,t[pre].l,p);
else insert(t[u].r,mid+1,r,t[pre].r,p);
}
int query(int x,int y,int l,int r,int k) {
if(l==r) return b[l];
int ln=t[t[y].l].v-t[t[x].l].v;
int rn=t[t[y].r].v-t[t[x].r].v;
if(k<=ln) return query(t[x].l,t[y].l,l,mid,k);
if(k<=rn) return query(t[x].r,t[y].r,mid+1,r,k);
return 0;
}
int main()
{
in(n), in(m);
for (int i=1;i<=n;i++) in(a[i]),b[i]=a[i];
sort(b+1,b+1+n); num=unique(b+1,b+1+n)-b-1;
for (int i=1;i<=n;i++) {
int p=lower_bound(b+1,b+1+num,a[i])-b;
insert(rt[i],1,num,rt[i-1],p);
}
for (int i=1,l,r,k;i<=m;i++) {
in(l),in(r), k=(r-l+1)/2+1;
printf("%d\n",query(rt[l-1],rt[r],1,num,k));
}
}
[POI2014] KUR-Couriers (主席树)的更多相关文章
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- 【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 ...
- 【bzoj3524】[Poi2014]Couriers 主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
- BZOJ 3524 Couriers | 主席树
BZOJ 3524 Couriers 题意 求一个区间内出现超过区间长度的一半的数,如果没有则输出0. 题解 我可能太菜了吧--这道题愣是没想出来-- 维护权值主席树,记录每个数都出现过多少次: 查询 ...
- 2018.09.14 洛谷P3567 [POI2014]KUR-Couriers(主席树)
传送门 简单主席树啊. 但听说有随机算法可以秒掉%%%(本蒟蒻并不会) 直接维护值域内所有数的出现次数之和. 当这个值不大于区间总长度的一半时显然不存在合法的数. 这样在主席树上二分查值就行了. 代码 ...
- [POI2014]KUR-Couriers BZOJ3524 主席树
给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两 ...
- 3524: [Poi2014]Couriers -- 主席树
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MB Description 给一个长度为n的序列a.1≤a[i]≤n.m组 ...
随机推荐
- scikit-learn 0.18中的cross_validation模块被移除
环境:scikit-learn 0.18 , python3 from sklearn.cross_validation import train_test_split from sklearn.gr ...
- A Product Recall 产品召回
Rick: The Board of Directors has come to a decision. Our company will take an image hit, and it's go ...
- Twitter推广消息可使品牌线下销售额增长三成
新浪科技讯 北京时间8月9日上午消息,Twitter周四宣布,该公司的推广消息(Promoted Tweet)可以让品牌的线下销售增长29%. 此外,Twitter当天还推出了一个新项目,让品牌可以追 ...
- DoItYourself!
在杨老师的勉励下,我准备开始“自己”写程序.速度很慢,不过在写的过程中对于用到的几个函数更加熟悉.也尝试多学一点,学透一点.遇到不会的函数,语法不清楚的,还是会百度,不过会自己再敲一遍.重复下去. 下 ...
- python中 try、except、finally 的执行顺序
def test1(): try: print('to do stuff') raise Exception('hehe') print('to return in try') return ...
- struts通配符*的使用
<action name="user_*" class="com.wangcf.UserAction" method="{1}"> ...
- python 为什么没有自增自减符
>>> b = 5 >>> a = 5 >>> id(a) 162334512 >>> id(b) 162334512 > ...
- HDU 5464 Clarke and problem 动态规划
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5464 Clarke and problem Accepts: 130 Submissions: ...
- DB2 日志
跟Oracle类似DB2也分为两个模式,日志循环vs归档日志,也就是非归档和归档模式,下面对这两种模式做简单的介绍. 日志循环 日志循环是默认方式,也就是非归档模式,这种模式只支持backup off ...
- 【BioCode】读文件夹以发现缺失文件
代码说明: 使用单个蛋白质的txt计算PSSM生成的结果为单个的PSSM文件. 但是由于一些原因(如蛋白质序列过长),会导致一些蛋白质txt文件无法计算出pssm,为了找到这些没有计算出pssm的蛋白 ...