虽然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. nginx 通过rsyslog发日志 rsyslog服务器挂掉 日志丢失问题

    nginx 配置: user nginx; worker_processes 1; syslog local5 nginx-zjzc01; rsyslog 服务器收到的消息: -rw-r--r-- 1 ...

  2. iPhone/iTouch免99美刀真机调试

    本文经本人验证,攻略来源于网上,由于多次转载原始出处不可靠,故无法对原作者进行链接引用,抱歉. 本文仅为记录流程,以备日后查询.本文版权所无,欢迎转载和拍砖. 测试环境: XCode 4.0.2 + ...

  3. python-大话装饰器

    装饰器 装饰器是个什么玩意呢?是个会了不难,装逼神器.但是如果不了解理解起来还是很抽象,让我们试试这个装逼神器吧! 1.什么是装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典 ...

  4. python中判断readline读到文件末尾

    fp = open('somefile.txt') while True: line = fp.readline() if not line: #等价于if line == "": ...

  5. Sequence operation(线段树区间多种操作)

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. android基础5——使用资源

    Android会基于当前的硬件.设备和语言配置来为某个资源标识符选择最合适的值. 1.在代码中使用资源 使用静态类R来访问资源.R类是基于外部资源而生的类,并且是在项目编译的时候创建的.R的每一个子类 ...

  7. Android_按钮被按下效果的实现(selector选择器)

    在很多刚入门的新手在开发实例的过程中,经常会遇到要按下某个ImageView时,需要加入确认感的时候.需要在按下的时候,控制ImageVIew内图片的显示. 在我是新手的时候,也这样做过.所以这里简单 ...

  8. javascript DOM,它到底是什么-------Day32

    这一晚上看的我是头疼不已啊,为什么呢? 终究是半路出家,我对javascript的理解仅仅停留在:调用javascript,改变页面样式,元素和实现一些事件的响应,尽管须要的时候可能会用,可是到底使用 ...

  9. SQL学习之用通配符进行数据过滤

    一.Like操作符 之前介绍的所有的操作符都是针对已知值进行过滤.不管匹配一个值还是多个值,检验大于还是小于已知值,或者检查某个范围的值,其共同点是过滤中使用的值都是已知的. 但是这种方法并不是任何时 ...

  10. C#Excel导出导入

    using System; using System.Collections.Generic; using NPOI; using NPOI.HPSF; using NPOI.HSSF; using ...