2724: [Violet 6]蒲公英

Time Limit: 40 Sec  Memory Limit: 512 MB
Submit: 2900  Solved: 1031
[Submit][Status][Discuss]

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 <= 40000, m <= 50000

Source

[Submit][Status][Discuss]

HOME Back

写的第一道分块题...结果几乎全都是照着$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]蒲公英的更多相关文章

  1. BZOJ 2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1633  Solved: 563[Submit][Status ...

  2. BZOJ 2724: [Violet 6]蒲公英( 分块 )

    虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...

  3. [BZOJ 2724] [Violet 6] 蒲公英 【分块】

    题目链接:BZOJ - 2724 题目分析 这道题和 BZOJ-2821 作诗 那道题几乎是一样的,就是直接分块,每块大小 sqrt(n) ,然后将数字按照数值为第一关键字,位置为第二关键字排序,方便 ...

  4. 【刷题】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 ...

  5. BZOJ 2724: [Violet 6]蒲公英 [分块 区间众数]

    传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...

  6. BZOJ.2724.[Violet 6]蒲公英(静态分块)

    题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...

  7. BZOJ 2724 [Violet 6]蒲公英(分块)

    题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的 ...

  8. 【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1908  Solved: 678 Description In ...

  9. 二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园

    BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ## ...

随机推荐

  1. Codeforces Round #466

    A. Points on the line 题意 给定一条直线上\(n\)个点,要求去掉最少的点,使得直线上相距最远的两个点的距离\(\leq d\). 思路 枚举长度为\(d\)的区间. Code ...

  2. Deploy Openstack with RDO and Change VNC console to Spice

    Deploy Openstack with RDO and Change VNC console to Spice host os: centOS 7 server config network an ...

  3. bind1st bind2nd的使用

    STL中的函数 bind1st. bind2nd用于将一个二元算子转换成一元算子,需要两个 参数,要转换的bf和一个值v. 参考:http://blog.csdn.net/simahao/articl ...

  4. css如何将div画成三角形

    首先了解一下盒模型: 盒模型 先看一段代码: #div1{ height: 100px; border-style: solid; border-width: 100px 100px 100px 10 ...

  5. 数据分析python应用到的ggplot

    数据分析中应用到python中的ggplot库,可以用来画图 数据之类的用优达学院中课程七中的数据为例 数据是:https://s3.amazonaws.com/content.udacity-dat ...

  6. WordPress插件:WP No Category Base 去除分类Category目录

    不少折腾WordPress的朋友都希望去掉分类链接中的 /category/ 目录标志,网上很多这方面的教程,据倡萌所知,除了使用 WP No Category Base 插件(或类似插件),其他的方 ...

  7. 【58沈剑架构系列】主从DB与cache一致性

    本文主要讨论这么几个问题: (1)数据库主从延时为何会导致缓存数据不一致 (2)优化思路与方案 一.需求缘起 上一篇<缓存架构设计细节二三事>中有一个小优化点,在只有主库时,通过“串行化” ...

  8. <node.js爬虫>制作教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...

  9. out与ref修饰符

    out修饰符 定义 作用 使用注意 总结 定义 out意为output,所以被out修饰的参数叫做输出参数. 通过使用out修饰的参数,方法可以返回对应参数的值   作用 先看一个例子 定义变量:   ...

  10. ubuntu sublime text 3 build 3083 license

    经验证:sublime text 3 3083可用 ----- BEGIN LICENSE -----Andrew WeberSingle User LicenseEA7E-855605813A03D ...