虽然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)

-------------------------------------------------------------------

#include<cstdio>

#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
 
using namespace std;
 
typedef pair<int, int> pii;
 
const int maxb = 209;
const int maxn = 40009;
 
struct HASH {
int h[maxn], n;
HASH() : n(0) {
}
void Add(int v) {
h[n++] = v;
}
void Work() {
sort(h, h + n);
n = unique(h, h + n) - h;
}
inline int Hash(int v) {
return lower_bound(h, h + n, v) - h;
}
inline int _Hash(int v) {
return h[v];
}
} H;
 
int read() {
char c = getchar();
int ret = 0;
for(; !isdigit(c); c = getchar()) c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * 10 + c - '0';
return ret;
}
 
int seq[maxn];
int sum[maxb][maxn], cnt[maxb][maxb][maxb], c[maxn], Id[maxb][maxn];
int N, Q, B, n;
pii Mode[maxb][maxb]; // <numId, cnt>
 
void Init() {
N = read(); Q = read();
B = (int) sqrt(N);
n = N / B;
if(N % B) n++;
for(int i = 0; i < N; i++)
H.Add(seq[i] = read());
H.Work();
for(int i = 0; i < N; i++)
seq[i] = H.Hash(seq[i]);
memset(sum, 0, sizeof sum);
for(int i = 0; i < N; i++)
sum[i / B][seq[i]]++;
for(int i = n; i--; )
for(int j = 0; j < H.n; j++)
sum[i][j] += sum[i + 1][j];
for(int i = 0; i < n; i++) {
memset(c, 0, sizeof c);
int Max = 0, numId;
for(int j = i; j < n; j++) {
int p = j * B;
for(int k = 0; k < B; k++, p++) if(++c[seq[p]] > Max) {
numId = seq[p];
Max = c[seq[p]];
} else if(c[seq[p]] == Max) {
numId = min(numId, seq[p]);
}
Mode[i][j] = make_pair(numId, Max);
}
}
memset(cnt, 0, sizeof cnt);
memset(Id, -1, sizeof Id);
for(int i = 0; i < n; i++) {
Id[i][H.n] = 0;
int p = i * B;
for(int j = 0; j < B; j++, p++) {
int v = seq[p];
if(!~Id[i][v])
Id[i][v] = Id[i][H.n]++;
cnt[i][j][Id[i][v]]++;
}
for(int j = B; j--; )
for(int k = 0; k < Id[i][H.n]; k++)
cnt[i][j][k] += cnt[i][j + 1][k];
}
}
 
inline int getSum(int l, int r, int v) {
return sum[l][v] - sum[r + 1][v];
}
 
inline int getCnt(int Block, int l, int r, int numId) {
return cnt[Block][l][Id[Block][numId]] - cnt[Block][r + 1][Id[Block][numId]];
}
 
int solve(int l, int r) {
if(l > r) swap(l, r);
int lb = l / B, rb = r / B, ans, CNT = 0;
memset(c, 0, sizeof c);
if(rb - lb > 1) {
pii &t = Mode[lb + 1][rb - 1];
ans = t.first;
CNT = t.second;
for(int i = l; i / B == lb; i++) {
int v = seq[i], Cnt = getCnt(lb, l % B, B - 1, v) + getCnt(rb, 0, r % B, v);
Cnt += getSum(lb + 1, rb - 1, v);
if(Cnt > CNT)
ans = v, CNT = Cnt;
else if(Cnt == CNT)
ans = min(ans, v);
}
for(int i = rb * B; i <= r; i++) {
int v = seq[i], Cnt = getCnt(lb, l % B, B - 1, v) + getCnt(rb, 0, r % B, v);
Cnt += getSum(lb + 1, rb - 1, v);
if(Cnt > CNT)
ans = v, CNT = Cnt;
else if(Cnt == CNT)
ans = min(ans, v);
}
} else if(lb + 1 == rb) {
for(int i = l; i / B == lb; i++) {
int v = seq[i], Cnt = getCnt(lb, l % B, B - 1, v) + getCnt(rb, 0, r % B, v);
if(Cnt > CNT)
ans = v, CNT = Cnt;
else if(Cnt == CNT)
ans = min(ans, v);
}
for(int i = rb * B; i <= r; i++) {
int v = seq[i], Cnt = getCnt(lb, l % B, B - 1, v) + getCnt(rb, 0, r % B, v);
if(Cnt > CNT)
ans = v, CNT = Cnt;
else if(Cnt == CNT)
ans = min(ans, v);
}
} else if(lb == rb) {
for(; l <= r; l++) {
int v = seq[l], Cnt = getCnt(lb, l % B, r % B, v);
if(Cnt > CNT)
ans = v, CNT = Cnt;
else if(Cnt == CNT)
ans = min(ans, v);
}
}
return H._Hash(ans);
}
 
void Work() {
int ans = 0;
while(Q--) {
int l = read(), r = read();
printf("%d\n", ans = solve((l + ans - 1) % N, (r + ans - 1) % N));
}
}
 
int main() {
Init();
Work();
return 0;
}

-------------------------------------------------------------------

2724: [Violet 6]蒲公英

Time Limit: 40 Sec  Memory Limit: 512 MB
Submit: 1140  Solved: 373
[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

BZOJ 2724: [Violet 6]蒲公英( 分块 )的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【BZOJ】2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2900  Solved: 1031[Submit][Statu ...

  9. 【BZOJ2724】[Violet 6]蒲公英 分块+二分

    [BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...

随机推荐

  1. HDU 5809 Ants(KD树+并查集)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5809 [题目大意] 给出一些蚂蚁和他们的巢穴,一开始他们会在自己的巢穴(以二维坐标形式给出),之后 ...

  2. oracle字符集查看修改

    一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...

  3. APUE读书笔记-第14章-高级I/O

    14.1 引言 *高级I/O包括非阻塞I/O.记录锁.系统V流机制.I/O多路转换(select和poll函数).readv和writev函数以及存储映射I/O(mmap) 14.2 非阻塞I/O * ...

  4. Struts2复习(四)防止表单反复提交

    1.採取请求转发的方式完毕表单内容的加入会造成内容的反复插入. 2.採取重定向的方式实现数据的加入不会导致数据的反复插入. 3.防止表单反复提交的两种方式 1)  通过重定向  2)  通过Sessi ...

  5. How To Set Dark Theme in Visual Studio 2010

    Want to use the visual studio color theme editor to set the dark theme or other themes? Below shows ...

  6. 微信小程序环境搭建

    第一步  IDE下载 Win版链接: https://pan.baidu.com/s/1gfAy18n 第二步 破解 最新下载链接: https://pan.baidu.com/s/1gfAy18n ...

  7. CSS Sprite小图片自动合并工具

    css-sprite是将css样式中零星的小图标,小图片合并成大图显示,这样能减小服务器并发连接数,减小服务器负载和带宽使用,有很高的实用价值.这里介绍一些自动合并图片并生成样式的工具. NodeJS ...

  8. Eclipse\MyEclipse 安装tomcat插件后,还需要配置Tomcat Home

    Eclipse 安装tomcat插件后,配置Tomcat Home的步骤如下: MyEclipse 安装tomcat插件后,配置Tomcat Home的步骤如下:

  9. spring拦截器的定义

    (一).拦截器的定义 1.为什么需要拦截器:在做身份认证或者是进行日志的记录时,我们需要通过拦截器达到我们的目的 2.什么事拦截器:在AOP(Aspect-Oriented Programming)中 ...

  10. shell检测interface是否已分配ip,qt调用shell脚本

    #include <QCoreApplication>#include <QDebug>#include <QTextStream>#include <QDi ...