[ZJb417]区间众数】的更多相关文章

题目大意: 给定一个长度为$n(1\leq n\leq10^5)$的正整数序列$s(1\leq s_i\leq n)$,对于$m(1\leq m\leq10^)$次询问$l,r$,每次求区间$[s_l,\ldots,s_r]$中,众数出现的次数以及众数的个数. 思路: 莫队. 对于询问$l,r$,维护每个数$s_i$出现的次数$cnt1[i]$以及每个$cnt1[i]$出现的次数$cnt2[i]$. #include<cmath> #include<cstdio> #include…
Input Output Sample Input 6 3 1 2 3 2 1 2 1 5 3 6 1 5 Sample Output 1 2 1 HINT \(n <= 40000\),$ m <= 50000$ 题意: 求区间众数 题解: 见代码 //解决本题的重要性质: //对于两个区间a,b,其中已知a区间的众数k //则众数一定为k或是b区间的任意一个数 #include<bits/stdc++.h> #define re register int using names…
2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1908  Solved: 678 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 Output Sample Input 6 3 1 2 3 2 1 2 1 5 3 6 1 5 Sample Output 1 2 1 HINT 修正下: n <= 4…
luogu4168蒲公英(区间众数) 给定n个数,m个区间询问,问每个询问中的众数是什么. 题面很漂亮,大家可以去看一下. 对于区间众数,由于区间的答案不能由子区间简单的找出来,所以似乎不能用树形结构. 用分块的话,设一个区间[x, y],里面包含的最大连续的块的左端点是l,右端点是r.那么显然,这个区间的众数要么是[l, r]的众数,要么是[x, l)和(r, y]中的任意数.所以可以用\(f[i][j]\)表示第i到j块的众数是什么,同时用\(s[i][x]\)表示前i个块中数x的出现次数.…
题面. 许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为"大分块". 其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关问题. 让我们在线处理区间众数. 数据范围1e5,考虑分块. 先对蒲公英种类离散化. 预处理 预处理出两个数组. 一个数组sum[ i ][ j ]表示第j种颜色到第i个分块的前缀和. 另一个数组 zhongshu[ i ][ j ]表示第i个分块到第j个分块这个区间内的众数. 维护这两个操作时间复杂度都不能超过n3/2.…
传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][j-1],j中出现的数}$,复杂度$O(N^2/S)$,常数比较小吧 最近用$pair$上瘾了... 然后查询$[l,r]$时,整块直接查,两边不完整的枚举出现的数,然后加上整块里出现次数来更新 求整块的出现次数,可以用$v[i]$表示数字$i$出现位置,二分来找,复杂度$O(NSlogN)$ 或者…
如果不是在线,就是裸的莫队. 但这道题要求在线,然后就不会了.. 标程: http://hi.baidu.com/__vani/item/ecc63f3527395283c2cf2945 算法主要是分块,然后处理处f[i][j]从第i块到第j块这个块区间的信息. 第一个算法的思想是每个块区间除了维护答案,还记录了该块区间中每个数的个数,这样可以快速添加增加一个数到该区间,所以他查询的时候就是找到查询区间的完整的块,然后向左右扩展,记录下答案,再撤销修改.设块的长度为L,则时间复杂度为:O(m*n…
$ \color{#0066ff}{ 题目描述 }$ 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关. 为了简化起见,我们把所有的蒲公英看成一个长度为n的序列 \((a_1,a_2..a_n)\),其中 \(a_i\) 为一个正整数,表示第i棵蒲公英的种类编号. 而每次询问一个区间 [l,r],你需要回答区间里出现次数最多的是哪种蒲公英,如果有若干种蒲公英出现次数相同,则输出种类编号最小的那个. 注意,你的算法必须是在线的 \(\color{#0066ff}{输入格式}\) 第一…
这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众数都达不到. 我已开始把某个离散后的值当成了坐标,调了好久....... #include<cstdio> #include<cmath> #include<vector> #include<cstring> #include<algorithm>…
6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vector\)维护,每次插入时先找到位置所在的块,再暴力插入. 如果数据不随机,即如果先在一个块有大量单点插入,这个块的大小会大大超过\(\sqrt n\),那块内的暴力就没有复杂度保证了. 为此引入一个操作:重新分块(重构) 每\(\sqrt n\)次插入后,重新把数列平均分一下块,重构需要的复杂度为\(…
题目链接 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区间中随机拿出一个字符\(x\),然后把\(x\)从这个区间中删除,你要维护一个集合S 如果\(S\)为空,你\(rp\)减\(1\) 如果S中有一个元素不小于\(x\),则你\(rp\)减\(1\),清空\(S\) 之后将\(x\)插入\(S\) 由于你是大爷,平时做过的题考试都会考到,所以每次询问你搞完这段区间的字符之后最多还有多少\(rp\)?\(rp\)初始为\(0\) 询问之间不互相影响~ 输入输出格式…
题目链接 题目大意:给定一段长度为$n$的序列和$m$次询问,每次询问区间$[l,r]$内的最小的众数.$n\leq 40000,a_i\leq 10^9$ ----------------------------- 因为$a_i\leq 10^9$,显然不能开那么大的数组.所以要离散化.对于离散化后的数组,我们维护两个值$sum[i][j]$和$p[i][j]$.$sum[i][j]$表示前$i$个块中$j$出现的次数,这个$O(n \sqrt n)$暴力枚举就好.$p[i][j]$表示块$i…
题意:给出区间内的最小众数 思路:分块,离散化每个数,开vector记录每个数p出现的位置,这样就能二分出L,R以内p的个数了.众数有一个性质,用mode(a)表示集合a的众数,那么mode(a∪b) ∈ mode(a)∪b .那么我先预处理出任意两块的众数f[i][j],这样众数就是f[i][j]和旁边两块数中的其中一个了,直接遍历这些数即可. block不能开方,开30能过.都靠玄学.... 代码: #include<cmath> #include<set> #include&…
题目链接 题目 Description 给定一个非递减数列Ai,你只需要支持一个操作:求一段区间内出现最多的数字的出现次数. Input 第一行两个整数N,Q 接下来一行有N个整数,表示这个序列. 接下来Q行每行一个操作:A B,询问A到B之间出现最多的数字. 1<=N,Q<=100000.-100000<=Ai<=100000 Output 每组数据若干行,每行对应一个询问的答案. Sample Input 10 3 -1 -1 1 1 1 1 3 10 10 10 2 3 1…
题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕的怪物召唤出来的那个坏蛋也很坏呢.不过奶奶说他是很难受的时候才做出这样的事的…… 最近村子里长出了一大片一大片的蒲公英.一刮风,这些蒲公英就能飘到好远的地方了呢.我觉得要是它们能飘到那个城市里面,让哥哥看看就好了呢! 哥哥你要快点回来哦! 爱你的妹妹 Violet Azure 读完这封信之后微笑了一…
题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB    定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数n和k(1<=n<=100000,k<=n*(n-1)/2) 第二行n个数,0<=每个数<2^31 Output 一个数表示答案.   Input示例 4 2 1 2 3 2   Output示例 2 题意: 思路: 先把数组都离散为[1,n]的数,注意相等的;再二分答案t,ch…
/* 查询区间众数,要求强制在线 设有T个块 1.众数只可能在大块[L,R]里或者两端[l,L) (R,r]里出现 2.大块的众数只要预处理打表一下即可,复杂度n*T(这样的区间有T*T个) 3.两端的众数需要枚举每个元素,然后查询这个元素在区间[l,r]里出现的次数 用一个vector记录每个值出现的位置,然后用二分找其在区间[l,r]出现的次数即可 这部分每次查询的复杂度是N/T*logN, 块长取sqrt(nlogn) */ #include<bits/stdc++.h> using n…
成功的秘诀,在于克服自己看题解的冲动……[笑哭].自己A掉这题还是灰常开心的~ 以及爱死 two - pointer ! two - pointer 大法是真的好哇……这个题目有上一题的经验:求第\(K\) 大 --> 二分第 \(K\) 大的值 --> 检验当前二分的值排名是第几.而这样之所以可以解决问题在于:直接求第 \(K\) 并不好求,而检验一个值的排名却相对容易.所以我们现在的问题就转化为了如何计算出区间的值 \(>= mid\) 的区间的个数? 做题之前先找规律 &…
Once, Leha found in the left pocket an array consisting of n integers, and in the right pocket q queries of the form l r k. If there are queries, then they must be answered. Answer for the query is minimal x such that x occurs in the interval l r str…
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t…
1743:前后作差可以转化成不可重叠最长公共字串问题,运用后缀数组解决(参考罗穗骞神犇的论文) #include <cstdio> #include <cstring> #include <algorithm> ; ; int code[maxL]; int len; int sa[maxL]; int sr[maxL]; int ht[maxL]; int stp[maxL]; int rdx[maxL]; bool input() { scanf("%d&…
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和,事实上我是写后缀和..因为下标从0开始..), cnt[i][j][k]表示第i块中的前j个数中,k出现次数.预处理O(N1.5), 询问每次O(N0.5), 总O((N+M)N0.5) --------------------------------------------------------…
胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采用了新师爷的策略,乡民们叫苦不堪,开始组织起来暴力抗租. 夹克老爷很愤怒,他决定派家丁常驻村中进行镇压. 诺德县 有N个村庄,编号0 至 N-1,这些村庄之间用N - 1条道路连接起来. 家丁都是经过系统训练的暴力机器,每名家丁可以被派驻在一个村庄,并镇压当前村庄以及距离该村庄不超过K段道路的村庄.…
洛谷4月月赛R2 打酱油... A.koishi的数学题  线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <ctime> using namespace std; typedef long long ll; const int N=…
BZOJ_3524_[Poi2014]Couriers_主席树 题意:给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 分析: 区间众数我们可以用主席树搞定 具体地,比较左右子树siz大小即可 代码: #include <stdio.h> #include <string.h> #include <algorithm> using names…
BZOJ_2223_[Coci 2009]PATULJCI_主席树 Description 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 Output no yes 1 no yes 1 no yes 2 no yes 3   区间众数,可以用主席树求. 查询时判断那边大走哪边.   代码: #include <stdio.h> #include <string.h> #include <a…
历尽千辛万苦终于AC了这道题目... 我们考虑1个区间\([l,r]\), 被其完整包含的块的区间为\([L,R]\) 那么众数的来源? 1.\([l,L)\)或\((R,r]\)中出现的数字 2.\([L,R]\)中的众数 思路逐渐清晰起来 我们考虑维护这样的两个量 \(P[i][j]\)表示从第i块到第j块的区间(最小)众数 \(S[i][j]\)表示前i块中j的出现次数 先直接离散化或者hash或者unordered_map处理,然后维护 结合刚才的思路,不难得到: 1.求出\([l,L)…
洛谷 Codeforces 思路 最初的想法:后缀数组+区间众数,似乎并不能过. 既然后缀数组不行,那就按照套路建出广义SAM,然后把\(S\)放在上面跑,得到以每个点结尾会到SAM上哪个节点. 询问时对于\(p_r\)所在的节点,倍增往parent树上跳,找到包含\([p_l,p_r]\)的最小区间. 然后统计该节点\([l,r]\)的模式串中最多的是谁,用线段树合并实现. 好像就做完了? 特判 一般情况下,如果匹配到\(p_r\),那么\(S(p_l,p_r)\)一定时当前节点的祖先. 但有…
题意:区间众数,不带修改,带修改刚看了一眼没看懂cls在讲啥QAQ. 题解:按照代码中那个sqrt(n/2/log2(n))大小分块,可以用均值不等式证明的,就是假设查询和n同级,然后一通爆算就可以得出了.然后预处理出(i,j)块之间最多的数.然后不满一块的部分在vector上二分,这题要先离散化.PS:loj上可以看别人代码学习速度++ 啊.因为把hzwer的1-9看了一遍,时间有限,就随便挑一个了,然后bzoj上的题是权限题,就注册了loj找了份简洁的学着写了,不太习惯,然后有更优秀的做法,…
LOJ BZOJ 洛谷 又来发良心题解啦 \(Description\) 给定一个序列\(A_i\).求有多少个子区间,满足该区间众数出现次数大于区间长度的一半. \(n\leq5\times10^5,\ 0\leq A_i\lt n\). \(Solution\) 考虑\(x\)作为众数合法的区间有哪些.令\(B_i=[A_i=x]\),对\(B_i\)求个前缀和\(s_i\).那么区间\([l,r]\)合法当且仅当\(s_r-s_{l-1}\gt0\). 其实就是对\(s\)求顺序对个数.用…