【BZOJ】2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英
Time Limit: 40 Sec Memory Limit: 512 MB
Submit: 2900 Solved: 1031
[Submit][Status][Discuss]
Description
.gif)
Input
.gif)
修正一下
l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1
Output
.gif)
Sample Input
1 2 3 2 1 2
1 5
3 6
1 5
Sample Output
2
1
HINT
.gif)
修正下:
n <= 40000, m <= 50000
Source
写的第一道分块题...结果几乎全都是照着$hzwer$写的QAQ,tcltcl...
先离散化,维护块块之间的众数,用$vector$存每个颜色出现的每个位置,查询的时候在$vector$里面用$upper_bound$和$lower_bound$计算区间颜色数量,统计的时候,整个块答案先直接得到,块两边多余的元素暴力计算贡献,如果可以更优就更新。
主要是注意分块中的一些细节,比如块的左闭右开(每次都要改很久aaa!!!),区间范围!还有就是不要再不小心把一个变量重新定义两次叻...QAQ
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std; int n, m;
ll a[], ls[], id[], cnt[];
int blo, bl[], f[][];
vector < int > vc[]; void init ( int x ) {
memset ( cnt, , sizeof ( cnt ) );
int mx = , ans = ;
for ( int i = ( x - ) * blo + ; i <= n; i ++ ) {
cnt[a[i]] ++;
int t = bl[i];
if ( cnt[a[i]] > mx || ( cnt[a[i]] == mx && id[ans] > id[a[i]] ) )
mx = cnt[a[i]], ans = a[i];
f[x][t] = ans;
}
} int query ( int l, int r, int x ) {
int t = upper_bound ( vc[x].begin ( ), vc[x].end ( ), r ) - lower_bound ( vc[x].begin ( ), vc[x].end ( ), l );
return t;
} int query ( int l, int r ) {
int ans, mx;
ans = f[bl[l]+][bl[r]-];
mx = query ( l, r, ans );
for ( int i = l; i <= min ( bl[l] * blo, r ); i ++ ) {
int t = query ( l, r, a[i] );
if ( t > mx || ( t == mx && id[a[i]] < id[ans] ) )
ans = a[i], mx = t;
}
if ( bl[l] != bl[r] )
for ( int i = ( bl[r] - ) * blo + ; i <= r; i ++ ) {
int t = query ( l, r, a[i] );
if ( t > mx || ( t == mx && id[a[i]] < id[ans] ) )
ans = a[i], mx = t;
}
return ans;
} int main ( ) {
scanf ( "%d%d", &n, &m );
blo = sqrt ( n );
for ( int i = ; i <= n; i ++ ) {
scanf ( "%lld", &a[i] );
ls[i] = a[i];
}
sort ( ls + , ls + + n );
int tot = unique ( ls + , ls + + n ) - ls - ;
int s = ; for ( int i = ; i <= n; i ++ ) {
int qwq = lower_bound ( ls + , ls + + tot, a[i] ) - ls;
vc[qwq].push_back ( i );
id[qwq] = a[i];
a[i] = qwq;
}
for ( int i = ; i <= n; i ++ ) bl[i] = ( i + blo - ) / blo;
for ( int i = ; i <= bl[n]; i ++ ) init ( i );
int x = ;
for ( int i = ; i <= m; i ++ ) {
int l0, r0;
scanf ( "%d%d", &l0, &r0 );
int l = ( l0 + x - ) % n + , r = ( r0 + x - ) % n + ;
if ( l > r ) swap ( l, r );
x = id[query ( l, r )];
printf ( "%d\n", x );
}
return ;
}
【BZOJ】2724: [Violet 6]蒲公英的更多相关文章
- BZOJ 2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1633 Solved: 563[Submit][Status ...
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
- [BZOJ 2724] [Violet 6] 蒲公英 【分块】
题目链接:BZOJ - 2724 题目分析 这道题和 BZOJ-2821 作诗 那道题几乎是一样的,就是直接分块,每块大小 sqrt(n) ,然后将数字按照数值为第一关键字,位置为第二关键字排序,方便 ...
- 【刷题】BZOJ 2724 [Violet 6]蒲公英
Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 Output Sample Input ...
- BZOJ 2724: [Violet 6]蒲公英 [分块 区间众数]
传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...
- BZOJ.2724.[Violet 6]蒲公英(静态分块)
题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...
- BZOJ 2724 [Violet 6]蒲公英(分块)
题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的 ...
- 【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1908 Solved: 678 Description In ...
- 二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园
BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ## ...
随机推荐
- NYOJ 267 郁闷的C小加(二) (字符串处理)
题目链接 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值 ...
- mysql-connector-python取二进制字节时报错UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 0
在储存用户密码时,我使用了hmac算法对用户密码加密,加密出来的hash值是一个二进制字节串,我把这个字节串存到mysql的password字段,password字段的数据类型是varbinary. ...
- docker-It's possible that too few managers are online. Make sure more than half of the managers are online.
问题:docker ---- It's possible that too few managers are online. Make sure more than half of the manag ...
- javascript反混淆之packed混淆(二)
上次我们简单的入门下怎么使用html破解packed的混淆,下面看一个综合案例. 上次内容javascript反混淆之packed混淆(一) function getKey() { var aaaaf ...
- ie7浏览器兼容问题
win10 下如何调试Ie 网上有很多ie的测试工具,包括ms自己出的有,但是如果是win10系统,压根不需要这些玩意. win10 浏览器edge虽然是重写过的,但是win10并没有完全抛弃ie,可 ...
- fullpage.js 具体使用方法
1.fullpage.js 下载地址 https://github.com/alvarotrigo/fullPage.js 2.fullPage.js 是一个基于 jQuery 的插件,它能够很方便 ...
- tcgetattr函数与tcsetattr函数控制终端
6.4.4 使用tcgetattr函数与tcsetattr函数控制终端 为了便于通过程序来获得和修改终端参数,Linux还提供了tcgetattr函数和tcsetattr函数.tcgetattr用于 ...
- python_xlsxwriter模块
1.workbook类 add_worksheet 用于添加一个新的工作表,sheetname为工作表名称,默认是sheet1,例如: worksheet = workbook.add_workshe ...
- procedure of object 对象的函数指针
应用:http://www.cnblogs.com/del88/p/6361117.html 有 class of object ----- 类的类型 那么自然有 方法的类型,方法的类型 分为两种: ...
- Java web项目中新建maven项目出现的问题
1.首先新建maven项目,新建Maven时出现了版本问题,报错 第一个错误:jdk版本与project facets不匹配(大概是这样,忘记截图了),那么解决办法是: 在项目右击--->Pro ...