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

Vani原创

转载于:https://www.cnblogs.com/JSZX11556/p/4989126.html

BZOJ 2724: [Violet 6]蒲公英( 分块 )相关推荐

  1. Bzoj 2724: [Violet 6]蒲公英(分块)

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MB Description Input 修正一下 l = (l_0 + x - 1) ...

  2. bzoj 2724: [Violet 6]蒲公英(分块预处理)

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MB Submit: 2464  Solved: 848 [Submit][Stat ...

  3. bzoj 2724[Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MB Submit: 2630  Solved: 920 [Submit][Stat ...

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

    题目大意: 求区间众数,强制在线. 题解: 考虑分块,一段区间的众数一定在整块的众数和两边多出来的数中. 可能是众数的数有O(sqrt(n))个,然后我们考虑查询这些数在区间中出现了几次. 把原来的序 ...

  5. [Luogu P4168] [BZOJ 2724] [Violet]蒲公英

    洛谷传送门 BZOJ传送门 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也 ...

  6. 【bzoj2724】[Violet 6]蒲公英 分块+STL-vector

    题目描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 样例输入 6 3 1 2 3 2 1 2 1 5 3 ...

  7. [BZOJ2724][Violet 6]蒲公英

    [BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...

  8. BZOJ 2724蒲公英 (分块) 【内有块大小证明】

    题面 luogu传送门 分析 先分块,设块大小为x(之后我们会证明块大小取何值会更优) 步骤1 把所有的数离散化,然后对每个值开一个vector pos[i],pos[i]存储数i出现的位置 我们设查 ...

  9. 【分块】【Violet】蒲公英

    [描述] 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...

  10. Luogu P4168 [Violet]蒲公英(分块)

    P4168 [Violet]蒲公英 题意 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还 ...

最新文章

  1. 科研找到属于自己的思想
  2. Java String字符串补0或空格
  3. 递归走迷宫java_在Java中的迷宫递归回溯
  4. AWS load balancer
  5. 基于 Keras 用深度学习预测时间序列
  6. 【知识图谱系列】自适应深度和广度图神经网络模型
  7. SpringApplication run方法解析:SpringApplicationRunListeners(二)
  8. Mybatis SQL语句控制台打印
  9. 酒店系统服务器怎么修改时间,酒店服务器设置
  10. stm32中用到的实时系统_南京理工大学谢云云、谷志强等:光储系统如何在实时市场中获得更高的收益?...
  11. RocketMQ(四):生产者消息数据写入实现细节
  12. php的 提示无效字符,ORA-00911: 无效字符
  13. 机智云AIoT开发平台,物联网开发和运营从未如此简单
  14. 瞎谈干净架构(clean architecture)
  15. sqlserver 默认日期格式转换为 yyyy-MM-dd
  16. springboot如何解析邮箱
  17. Qt官方示例-虚拟键盘使用
  18. 交换机的各种工作模式
  19. 计算机考研专硕好考还是学硕好考,考研是学硕难考还是专硕难考?很多人都猜错了...
  20. js-16正则表达式

热门文章

  1. 编译OpenJDK12:a microsoft compiler is required
  2. 某LINUX平台,管道open直接崩溃
  3. 使用JNI加载JAVA虚拟机
  4. THAAD反导必将部署,各方已接受事实
  5. 如何正确获取安卓内置SD卡的路径
  6. redis php web管理,redis web界面管理工具 phpredisadmin
  7. windows 拖拽功能
  8. linux sdb目录,linux – / dev / sdb:没有这样的文件或目录(但是/ dev / sdb1等存在)...
  9. cassandra可视化工具_精华 | 140种Python标准库、第三方库和外部工具都有了
  10. Spring启动过程——源码分析(finishBeanFactoryInitialization(beanFactory))