bzoj3524 bzoj2223】的更多相关文章

bzoj3524这是我主席树的第一题 什么是主席树呢,就是n棵线段树,每棵线段树记录前缀每个数值(显然想到里离散化)出现次数 由于第i棵树相对于第i-1棵树只有logS个点不同(S为数值的种类数) 所以总的空间复杂度为O(nlogS),非常好理解: 由于每棵线段树的形态都是一样的,所以这些线段树是可以做减法的, 这是一个非常有用的性质,也很好的解决了区间的性质 然后解决这道题,这题问区间出现次数超过(r-l+1)/2的数,显然直接顺着主席树搜就可以了logS的复杂度 bzoj2223基本同样的题…
题目大意 给定一个大小为n,每个数的大小均在[1,c]之间的数列,你需要回答m个询问,其中第i个询问形如\((l_i, r_i)\),你需要回答是否存在一个数使得它在区间\([l_i,r_i]\)中出现至少\(\frac{r-l+1}{2}\)次. 题解 第一次写主席树. 不难发现,对于一个询问,只有可能要么有解,要么有一个解. 考虑到每个数均在一个确定的区间内,我们考虑开一棵权值线段树(以前一直用这种方法,但不知到这就是权值线段树)来记录每一个数字的出现次数. 考虑到他要求询问一个区间,我们只…
3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2436  Solved: 960[Submit][Status][Discuss] Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m.第二行n个数,a[i].接下来m行,…
[BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m.第二行n个数,a[i].接下来m行,每行两个数l,r,表示询问[l,r]这个区间. Output m行,每行对应一个答案. Sample Input 7 51 1 3 2 3 4 31 31 43 71 76…
题目链接1 题目链接2 主席树模板题 两题有细节不同 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<cmath> #include<ctime> #include<queue> #include<stack…
传送门 主席树经典题目. 直接利用主席树差分的思想判断区间中数的个数是否合法然后决定左走右走就行了. 实际上跟bzoj3524是同一道题. 代码: #include<bits/stdc++.h> #define N 300005 using namespace std; int n,m,sig,rt[N],ql,qr; struct Tree{ int son[N*30][2],siz[N*30],tot; inline void update(int&p,int las,int l,…
https://www.lydsy.com/JudgeOnline/problem.php?id=3524 https://loj.ac/problem/2432 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 水一发题解,重题:BZOJ2223:[Coci2009]PATULJCI #include<cstdio> #include<queue> #…
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行两个数n,m.第二行n个数,a[i].接下来m行,每行两个数l,r,表示询问[l,r]这个区间. 输出 m行,每行对应一个答案. 样例输入 7 5 1 1 3 2 3 4 3 1 3 1 4 3 7 1 7 6 6 样例输出 1 0 3 0 4 题解 主席树 同bzoj2223,也不需要离散化. b…
题意:给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. n,m≤500000 思路:这题可以用主席树巧妙地做 询问(x,y)区间时直接输出a[query(x,y)] 首先区间内个数>(r-l+1)/2的数字如果有的话有且只有一个 其次答案数字肯定在数字总和大于一半的一边 这样询问可以做到logn 离散化注意 ..]of record l,r,s:longint; end…
Couriers bzoj-3524 Poi-2014 题目大意:给定n个数的序列,询问区间内是否存在一个在区间内至少出现了(区间长度>>1)次的数.如果有,输出该数,反之输出0. 注释:$1\le n,m\le 5\cdot 10^5$. 想法:主席树裸题. 主流做法就是弄一个Existence数组询问有没有这样的数,然后查询区间中位数即可. 但是可以在query的时候强行查询,因为没有输出0,直接输出即可. 最后,附上丑陋的代码... ... #include <iostream&g…
题意: 给出一个长度为n的序列和m次询问. 每次询问给出区间[l,r],求区间中出现次数大于(r-l+1)/2的数字. n.m<=500000.1<=每一个数字<=n: 题解: 主席树的算是裸题吧,静态序列不用套树状数组,数据范围也省了离散化: 直接上主席树就能够了,复杂度就是O((n+m)logn)的样子: 空间略爆炸.可是假设取消Build()函数就能够过了. orz icebound神犇,搞了一种奇妙的建树法: void Insert(int l,int r,int &no…
Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m. 第二行n个数,a[i]. 接下来m行,每行两个数l,r,表示询问[l,r]这个区间. Output m行,每行对应一个答案. Sample Input 7 5 1 1 3 2 3 4 3 1 3 1 4 3 7 1 7 6 6 Sample Output 1 0…
Description Input   Output 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 6 6 9 7 10 Sample Input no yes 1 no yes 1 no yes 2 no yes 3 Sample Output   HINT Notice:输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim. 依旧主席树模板,无需离散化. 1<=Lim<=10000 So…
2223: [Coci 2009]PATULJCI Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 728  Solved: 292[Submit][Status][Discuss] Description Input Output 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 6 6 9 7 10 Sample Input noyes 1noyes 1noyes 2noyes 3 Sample…
可持久化线段树,其实就是类主席树了.. 3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1124 Solved: 390 [Submit][Status][Discuss] Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n…
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ建立在Linux平台下,而许多题的数据在Windows下制作,请注意输入.输出语句及数据类型及范围,避免无谓的RE出现. 3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1058  Solved: 363…
Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m.第二行n个数,a[i].接下来m行,每行两个数l,r,表示询问[l,r]这个区间. Output m行,每行对应一个答案. Sample Input 7 5 1 1 3 2 3 4 3 1 3 1 4 3 7 1 7 6 6 Sample Output 1 0 3…
题目链接 思路 观察这个\((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-…
题目描述 输入  先输入一个数n,然后一个数表示这n个数中最大的是多少,接下来一行n个数.然后一个数m,最后m行询问每次两个数l,r. 输出 no或者yes+这个数 样例输入 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 6 6 9 7 10 样例输出 noyes 1noyes 1noyes 2noyes 3 提示 Notice:输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim. 1<=Lim…
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行两个数n,m.第二行n个数,a[i].接下来m行,每行两个数l,r,表示询问[l,r]这个区间. 输出 m行,每行对应一个答案. 样例输入 7 5 1 1 3 2 3 4 3 1 3 1 4 3 7 1 7 6 6 样例输出 1 0 3 0 4 提示 [数据范围] n,m≤500000 因为出现次数…
题意 题目链接 Sol 严格众数只会出现一次,那么建出主席树,维护子树siz,直接在树上二分即可 #include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 2e6 + 10; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-') f =…
求区间内个数大于rank的一个数 主席树求一下就好啦! /************************************************************** Problem: 2223 User: rausen Language: C++ Result: Accepted Time:704 ms Memory:54712 kb ****************************************************************/ #inclu…
Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m. 第二行n个数,a[i]. 接下来m行,每行两个数l,r,表示询问[l,r]这个区间. Output m行,每行对应一个答案. Sample Input 7 5 1 1 3 2 3 4 3 1 3 1 4 3 7 1 7 6 6 Sample Output 1 0…
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3524 http://www.lydsy.com/JudgeOnline/problem.php?id=2223 [题解] 由于出现次数超过区间长度的一半的数最多只有1个,所以就可以分两半找了.. # include <stdio.h> # include <string.h> # include <iostream> # include <algorithm…
题目描述 样例输入 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 6 6 9 7 10 样例输出 no yes 1 no yes 1 no yes 2 no yes 3 题目大意 第一行输入n和lim,为序列数的个数和数的范围(1≤a[i]≤lim) 第二行输入n个数. 第三行输入m,为询问个数. 以下m行输入询问,如题. 对于每个询问,如果存在,输出yes和这个数,否则输出no. 题解 bzoj格式错了... 主席树. 对于每个询问,判断它能…
http://www.lydsy.com/JudgeOnline/problem.php?id=2223 Description Sample Input 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 6 6 9 7 10 Sample Output  no yes 1 no yes 1 no yes 2 no yes 3 HINT Notice:输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim.…
主席树(可持久化权值线段树)初探... 修改一个点只对树上logn个点有影响,所以新建logn个点就行了,总共新建mlogn个点. 查询一个区间[l,r],相当于将数一个一个加进树,询问第l到第r次操作,这个可以用前缀解决. 板子不慢..在第三页,KPM写指针的主席树貌似跑的飞快 #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<algori…
PATULJCI Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description Input 第一行两个整数n,INF,表示序列长度和ai的上限: 第二行有n个数,表示ai: 然后有一个整数m,表示询问个数: 接下来每行两个l,r,表示询问区间[l,r]中的答案. Output 输出m行,表示对于每个询问的答案.如果有这个数,则输出“yes”,然后输出数的值:否则输出“no”. Sample Input…
Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m. 第二行n个数,a[i]. 接下来m行,每行两个数l,r,表示询问[l,r]这个区间. Output m行,每行对应一个答案. 主席树板子题 话说为啥是个板子题,我也没看出来 查询时需要找出出现次数为\((r-l+1)/2\)的. 主席树基本操作,离散化是必须的.…
不带修改主席树裸题<=>莫队+权值分块裸题. 复杂度O(m*sqrt(n)). P.S.题目描述坑爹,第二个数是权值的范围. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define N 300001 #define M 10001 int f,c; inline void R(int &x){ c=0;f=1; for(;c<'0'||c…