「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告
蒲公英
Description
我们把所有的蒲公英看成一个长度为\(n\)的序列(\(a_1,a_2,...a_n\)),其中\(a_i\)为一个正整数,表示第i棵蒲公英的种类的编号。
每次询问一个区间\([l,r]\),你需要回答区间里出现次数最多的是哪种蒲公英,如果有若干种蒲公英出现次数相同,则输出种类编号最小的那个。
注意,你的算法必须是在线的。
Input Data
第一行两整数\(n,m\),表示有\(n\)棵蒲公英,mm次询问。
接下来一行\(n\)个空格分隔的整数\(a_i\),表示蒲公英的种类。
接下来\(m\)行,每行两个整数\(l_0,r_0\)。令上次的查询结果为\(x\)(如果是第一次查询,则\(x=0\))。
令\(l=(l_0+x-1) mod (n+1), r=(r_0+x-1)  mod (n+1)\)
Output Data
输出\(m\)行,每行一个整数,表示每次查询的结果。
Input / Output Sample
6 3
1 2 3 2 1 2
1 5
3 6
1 5
1
2
1
Data Limit
\(n \le 40000,m \le 50000,1 \le a_i \le 10^9n≤40000,m≤50000,1≤ai≤10^9\)
Problem Source
\(BZOJ2724\)
算法竞赛进阶指南\(P218-219\)
这道题和\(数列分块入门9\)蜜汁相似QAQ。
请自行参照我的\(数列分块入门9题解\)
这里仅放上代码QAQ——
代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 40005
int n, m, T;
int a[MAXN], b[MAXN], c[MAXN];
int d, f[2000][2000];
int s[MAXN];
vector<int> p[MAXN];
int Count( int l, int r, int x ){
	return upper_bound( p[x].begin(), p[x].end(), r ) - lower_bound( p[x].begin(), p[x].end(), l );
}
int Get( int l, int r ){
	if ( b[l] == b[r] ){
		int ans1(0), ans2(0);
		for ( int i = l; i <= r; ++i ){
			int t(Count( l, r, a[i] ));
			if ( t > ans2 ) ans1 = a[i], ans2 = t;
			if ( t == ans2 ) ans1 = min( ans1, a[i] );
		}
		return ans1;
	}
	int ans1(f[b[l] + 1][b[r] - 1]), ans2(Count( l, r, ans1 ));
	for ( int i = l; b[l] == b[i]; ++i ){
		int t(Count( l, r, a[i] ));
		if ( t > ans2 ) ans1 = a[i], ans2 = t;
		if ( t == ans2 ) ans1 = min( ans1, a[i] );
	}
	for ( int i = r; b[r] == b[i]; --i ){
		int t(Count( l, r, a[i] ));
		if ( t > ans2 ) ans1 = a[i], ans2 = t;
		if ( t == ans2 ) ans1 = min( ans1, a[i] );
	}
	return ans1;
}
int main(){
	scanf( "%d%d", &n, &T );
	d = 0;
	while( ( 1 << d ) <= n ) d++;
	d = (int)( n / sqrt( 2 * T * d ) );
	for ( int i = 1; i <= n; ++i ){
		scanf( "%d", &a[i] ); c[i] = a[i]; b[i] = ( i - 1 ) / d + 1;
	}
	sort( c + 1, c + n + 1 );
	m = unique( c + 1, c + n + 1 ) - c - 1;
	for ( int i = 1; i <= n; ++i ) a[i] = lower_bound( c + 1, c + m + 1, a[i] ) - c;
	for ( int i = 1; i <= n; ++i ) p[a[i]].push_back(i);
	for ( int i = 1; i <= b[n]; ++i ){
		memset( s, 0, sizeof s );
		int ans1(0), ans2(0);
		for ( int j = ( i - 1 ) * d + 1; j <= n; ++j ){
			s[a[j]]++;
			if ( s[a[j]] == ans2 ) ans1 = min( ans1, a[j] );
			if ( s[a[j]] > ans2 ) ans1 = a[j], ans2 = s[a[j]];
			if ( b[j + 1] != b[j] ) f[i][b[j]] = ans1;
		}
	}
	int x(0);
	while( T-- ){
		int l, r;
		scanf( "%d%d", &l, &r );
		l = ( l + x - 1 ) % n + 1; r = ( r + x - 1 ) % n + 1;
		int t(min( l, r )); r = max( l, r ); l = t;
		printf( "%d\n", x = c[Get( l, r )] );
	}
	return 0;
}
数列分块系列目录
蒲公英 <-
「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告的更多相关文章
- 洛谷_Cx的故事_解题报告_第四题70
		1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ... 
- 洛谷 P4168 [Violet]蒲公英 解题报告
		P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ... 
- 洛谷  P2317 [HNOI2005]星际贸易 解题报告
		P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ... 
- 洛谷 P3802 小魔女帕琪 解题报告
		P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ... 
- 洛谷 P2606 [ZJOI2010]排列计数  解题报告
		P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ... 
- 洛谷1303 A*B Problem 解题报告
		洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ... 
- [洛谷P4168][Violet]蒲公英
		题目大意:有$n(n\leqslant4\times10^4)$个数,$m(m\leqslant5\times10^4)$个询问,每次问区间$[l,r]$内的众数,若相同输出最小的,强制在线. 题解: ... 
- 洛谷 P4168 [Violet] 蒲公英
		历尽千辛万苦终于AC了这道题目... 我们考虑1个区间\([l,r]\), 被其完整包含的块的区间为\([L,R]\) 那么众数的来源? 1.\([l,L)\)或\((R,r]\)中出现的数字 2.\ ... 
- 洛谷 P4137 Rmq Problem /mex 解题报告
		P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ... 
随机推荐
- TensorFlow 中的卷积网络
			TensorFlow 中的卷积网络 是时候看一下 TensorFlow 中的卷积神经网络的例子了. 网络的结构跟经典的 CNNs 结构一样,是卷积层,最大池化层和全链接层的混合. 这里你看到的代码与你 ... 
- 全文索引——CONTAINS 语法
			Like直接在数据据中查找可以查到所有所需记录但是会扫描整个表会影响性能CONTAINS是基于全文索引进行查询,查询结果受系统全文索引分词的方法影响查询结果会不全.Select * FROM A Wh ... 
- H3C 802.11协议的发展
- C#的循环语句(四)
			一.while 循环(1).while 其实是for循环的变形写法for(int i = 1; i<=5;i++) {循环体:} 上面的for循环可以写成int i= 1:for(;i< ... 
- libsvm的安装,数据格式,常见错误,grid.py参数选择,c-SVC过程,libsvm参数解释,svm训练数据,libsvm的使用详解,SVM核函数的选择
			直接conda install libsvm安装的不完整,缺几个.py文件. 第一种安装方法: 下载:http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm. ... 
- HDU 1236
			水题~~但我做了很久: 题意:是中国人都懂了 思路:结构体排序: 以后要多用用重定义的排序手段,!!!!!多用!!多用!!多用!! #include<iostream> #include& ... 
- 2018-9-1-win2d-画出好看的图形
			title author date CreateTime categories win2d 画出好看的图形 lindexi 2018-09-01 16:25:40 +0800 2018-2-13 17 ... 
- 【codeforces 761B】Dasha and friends
			time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ... 
- [转]【转】大型高性能ASP.NET系统架构设计
			大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ... 
- P1018 灵灵排数字
			题目描述 今天灵灵收到了n张卡片,他需要给他们从小到大排序. 输入格式 输入的第一行包含一个整数 \(n(1 \le n \le 10^5)\) . 输入的第二行包含 \(n\) 个正整数,以空格间隔 ... 
