退役前8天:数论分块

引例:区间极大值 NKOJ2743

1.怎么分块 ?

1.把长度为 N 的区间分成若干块,每块长度为 S,共 N / S 块(除最后一块外);
2.其中第i块表示的区间范围是[(i - 1) * S + 1,i * S];
3.将每一块表示的数字记录下来,其中第i块记录在Max[i]中;


2.怎么操作 ?

一.将第X个数A[x]改为A[x] + Y:
1).A[x] = A[x] + Y;
2).找出X所在的块号i = (X - 1) / S + 1,暴力枚举块i中的每个数k,若a[k] > Max[i]则更新Max[i];

二.询问区间[X,Y]中的最大值:
1).计算X所在块号i = (X - 1) / S + 1,Y所在块号j = (Y - 1) / S + 1;
2).若i == j,说明区间[X,Y]在同一块中,直接暴力查询最大值;
3).若i != j,区间[X,Y]的左右两端可能覆盖了某块的一部分,两端直接暴力枚举,中间覆盖的若干整块直接讨论Max[]值.
退役前8天:数论分块

以下就是代码:

暂时没有,正在调试中...

退役前8天:数论分块

上一篇:Redis 持久化和集群


下一篇:CoProcessFunction实战三部曲之二:状态处理