bzoj2724
分块大法好!
首先预处理第i块到第j块的答案,这是可以在O(n*tot)内处理出来的 tot表示块数
然后考虑询问对于[l,r],答案只可能是[l,r]之间所夹整块[i,j]的答案和非整块中的位置上的数
下面我们要做的是快速求出一个数在区间[l,r]出现的次数
当然我一无脑就直接写了主席树,这当然可以复杂度为O(size*logn)
一开始TLE了,好来发现块大小为sqrt(n/log(n))最优,然后跑了20s就过了
后来一想,不对,直接预处理每个数在块1..i出现的次数不就可以了吗
这样求出一个数在区间[l,r]出现的次数只需要O(1)的时间,复杂度仅仅是O(size)
好像是的……这样可以在O(nsqrt(n))的时间内搞出来,这次只跑了7s左右
下面给出算法二
const maxn=; var f:array[..,..maxn] of longint;
a1,a2:array[..,..] of longint;
be,h,s,a,b,c,rank:array[..maxn] of longint;
ans,x,y,i,p,q,m,t,tot,size,n:longint; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure sort(l,r: longint);
var i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=b[(l+r) div ];
repeat
while b[i]<x do inc(i);
while x<b[j] do dec(j);
if not(i>j) then
begin
swap(b[i],b[j]);
swap(c[i],c[j]);
inc(i);
j:=j-;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; procedure clear(l,r:longint);
var i:longint;
begin
for i:=l to r do
s[rank[i]]:=-;
end; procedure pre;
var i,j,p,q:longint;
begin
for i:= to tot do //预处理在1..i的块中数出现的次数
begin
p:=i*size;
if p>n then p:=n;
for j:=(i-)*size+ to p do
inc(s[rank[j]]);
for j:= to m do
f[i,j]:=s[j];
end;
for i:= to tot do //预处理i~j块的答案
begin
p:=;
q:=;
fillchar(s,sizeof(s),);
for j:=(i-)*size+ to n do
begin
inc(s[rank[j]]);
if (s[rank[j]]>p) or ((s[rank[j]]=p) and (a[j]<q)) then
begin
p:=s[rank[j]];
q:=a[j];
end;
a1[i,be[j]]:=p;
a2[i,be[j]]:=q;
end;
end;
fillchar(s,sizeof(s),);
end; function ask(x,y:longint):longint;
var i,p,q,w:longint;
begin
if be[x]=be[y] then
begin
p:=;
q:=;
for i:=x to y do
begin
if s[rank[i]]=- then s[rank[i]]:=;
inc(s[rank[i]]);
if (s[rank[i]]>p) or (s[rank[i]]=p) and (a[i]<q) then
begin
p:=s[rank[i]];
q:=a[i];
end;
end;
clear(x,y);
exit(q);
end
else begin
p:=a1[be[x]+,be[y]-];
q:=a2[be[x]+,be[y]-];
for i:=x to be[x]*size do
begin
if s[rank[i]]=- then s[rank[i]]:=f[be[y]-,rank[i]]-f[be[x],rank[i]];
inc(s[rank[i]]); //关键
if (s[rank[i]]>p) or (s[rank[i]]=p) and (a[i]<q) then
begin
p:=s[rank[i]];
q:=a[i];
end;
end;
for i:=(be[y]-)*size+ to y do
begin
if s[rank[i]]=- then s[rank[i]]:=f[be[y]-,rank[i]]-f[be[x],rank[i]];
inc(s[rank[i]]);
if (s[rank[i]]>p) or (s[rank[i]]=p) and (a[i]<q) then
begin
p:=s[rank[i]];
q:=a[i];
end;
end;
clear(x,be[x]*size); //一点常数优化,不用fillchar
clear((be[y]-)*size+,y);
exit(q);
end;
end; begin
readln(n,q);
size:=trunc(sqrt(n));
for i:= to n do
begin
read(a[i]);
be[i]:=(i-) div size+;
b[i]:=a[i];
c[i]:=i;
end;
tot:=n div size;
if n mod size<> then inc(tot);
sort(,n);
m:=;
rank[c[]]:=;
for i:= to n do
begin
if b[i]<>b[i-] then inc(m);
rank[c[i]]:=m;
end;
pre;
t:=;
ans:=;
for i:= to q do
begin
readln(x,y);
x:=(x+ans-) mod n+;
y:=(y+ans-) mod n+;
if x>y then swap(x,y);
ans:=ask(x,y);
writeln(ans);
end;
end.
bzoj2724的更多相关文章
- [BZOJ2724][Violet 6]蒲公英
[BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...
- BZOJ2724 [Violet 6]蒲公英 分块
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...
- BZOJ2724 [Violet]蒲公英(分块)
区间众数.分块,预处理任意两块间所有数的众数,和每块中所有数的出现次数的前缀和.查询时对不是整块的部分暴力,显然只有这里出现的数可能更新答案.于是可以优美地做到O(n√n). #include< ...
- 【BZOJ2724】蒲公英(分块)
[BZOJ2724]蒲公英(分块) 题面 洛谷 谴责权限题的行为 题解 分块什么的都不会,根本就没写过几次. 复杂度根本不会分析,吓得我赶快来练练. 这题要求的是区间众数,显然没有什么很好的主席树之类 ...
- BZOJ2724 蒲公英 【分块】
BZOJ2724 蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被 ...
- 【BZOJ2724】[Violet 6]蒲公英 分块+二分
[BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...
- 【BZOJ2724】【Violet 6】蒲公英
蒲公英/分块入门九Byhzwer 辣鸡我复制粘贴题面格式极其丑陋,各位看原题面啦. [题目描述] 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关. 为了简化起见,我们把所有的蒲公英看成 ...
- BZOJ2724 [Violet]蒲公英 分块
题目描述 经典区间众数题目 然而是权限题,所以题目链接放Luogu的 题解 因为太菜所以只会$O(n*\sqrt{n}+n*\sqrt{n}*log(n))$的做法 就是那种要用二分的,并不会clj那 ...
- 蒲公英(bzoj2724)(分块+区间众数)
Input 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 ...
随机推荐
- Java序列化之Serializable
Java的序列化流程如下: Java的反序列化流程如下: 注意:并不是所有类都需要进行序列化,主要原因有两个 1)安全问题.Java中有的类属于敏感类,此类的对象数据不便对外公开,而序列化的对象数据很 ...
- css培训(三)
优先级 z-index 不设置 或auto 非static z-index :0 : z-index:-1: opacity 与层叠上下 opacity:.9 对其影响 小于1值 不具备堆叠 ...
- Java——(六)Collection之Queue集合
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容 ...
- cogs 2507 零食店
/* cogs 2507 零食店 跪了这题的数据了.... 第一遍Q*m 暴力询问 嗯 以为能的70 但只有40 Q已经到了1e6了 考试的时候 放弃了第三题又打了一遍 这次是Q*(n+logn) 最 ...
- WinForm中的事件触发机制学习
在一个Form窗体中拖个按钮,双击后系统自动生成代码: private void button1_Click(object sender, EventArgs e) { } 同时在窗体的Initial ...
- ORA-01653:表空间扩展失败的问题
以下内容来源于ORA-01653:表空间扩展失败的问题 今天发现,原来设备的数据表空间只有5M,已经满了,上网去找发现要进行扩展空间. 一.脚本修改方式: ----查询表空间使用情况---使用DB ...
- SQL拾遗
前两天同事问了个SQL问题,有个出价记录表[针对不同拍品出价],每个人都可以多次出价,要查下哪些拍品出价最高的人和出价次高的人是同一个人的记录,当时写了下面的SQL,今天先记下了,欢迎补充新的查询方式 ...
- ZOJ 刷题记录 (。・ω・)ノ゙(Progress:31/50)
[热烈庆祝ZOJ回归] P1002:简单的DFS #include <cstdio> #include <cstring> #include <algorithm> ...
- Perl中级第四章课后习题
1.下列表达式各表示什么不同的含义: $ginger->[2][1] ${$ginger[2]}[1] $ginger->[2]->[1] ${$ginger->[2]}[1] ...
- innerHtml写法
swt_center = "<div id='new_swt_wee'>"; swt_center += '<a href="javascript:vo ...