bzoj 2038 莫队算法
莫队算法,具体的可以看10年莫涛的论文。
大题思路就是假设对于区间l,r我们有了一个答案,那么对于区间l,r+1,我们
可以暴力的转移一个答案,那么对于区间l1,r1和区间l2,r2,需要暴力处理
的部分就是|r1-r2|+|l1-l2|如果将l看成x,r看成r,得到的暴力部分就是manhattan距离
那么我们将所有的询问,构成一张二维图,可以从一个点转移到另一个点,且总manhattan距离
尽可能的小,所以可以建立一颗manhattan mst,这样的话就可以得到最优的转移,但是实际来说
搞定一个manhattan mst需要的时间不小,我们可以不要最优解,将询问按l分块,只需要做到在每个
块中尽可能的优就行了,所以每个块中可以根据r排序,然后搞就行了
经莫队证明,这个算法的复杂度上界大概是o(n^1.5)
- /**************************************************************
- Problem:
- User: BLADEVIL
- Language: Pascal
- Result: Accepted
- Time: ms
- Memory: kb
- ****************************************************************/
- //By BLADEVIL
- type
- rec =record
- l, r, w, s :longint;
- end;
- var
- n, m :longint;
- c, size :array[..] of int64;
- len :longint;
- a :array[..] of rec;
- now :longint;
- col, ans :array[..] of int64;
- all, num :int64;
- procedure swap(var a,b:longint);
- var
- c :longint;
- begin
- c:=a; a:=b; b:=c;
- end;
- procedure swap_rec(var a,b:rec);
- var
- c :rec;
- begin
- c:=a; a:=b; b:=c;
- end;
- function gcd(a,b:int64):int64;
- begin
- if a<b then exit(gcd(b,a)) else
- if b= then exit(a) else exit(gcd(b,a mod b));
- end;
- procedure qs(low,high:longint);
- var
- i, j, xx, yy :longint;
- begin
- i:=low; j:=high; xx:=a[(i+j) div ].w;
- yy:=a[(i+j) div ].r;
- while i<j do
- begin
- while (a[i].w<xx) or (a[i].w=xx) and (a[i].r<yy) do inc(i);
- while (a[j].w>xx) or (a[j].w=xx) and (a[j].r>yy) do dec(j);
- if i<=j then
- begin
- swap_rec(a[i],a[j]);
- inc(i); dec(j);
- end;
- end;
- if i<high then qs(i,high);
- if j>low then qs(low,j);
- end;
- procedure init;
- var
- i :longint;
- begin
- read(n,m);
- for i:= to n do read(c[i]);
- len:=trunc(sqrt(m));
- for i:= to m do
- begin
- read(a[i].l,a[i].r);
- if a[i].l>a[i].r then swap(a[i].l,a[i].r);
- size[i]:=a[i].r-a[i].l+;
- a[i].w:=a[i].l div len+;
- a[i].s:=i;
- end;
- qs(,m);
- end;
- procedure main;
- var
- i, j :longint;
- begin
- i:=;
- while i<=m do
- begin
- now:=a[i].w;
- fillchar(col,sizeof(col),);
- for j:=a[i].l to a[i].r do
- begin
- ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
- col[c[j]]:=col[c[j]]+;
- end;
- inc(i);
- while a[i].w<=now do
- begin
- ans[a[i].s]:=ans[a[i-].s];
- for j:=a[i-].r+ to a[i].r do
- begin
- ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
- col[c[j]]:=col[c[j]]+;
- end;
- if a[i-].l<a[i].l then
- begin
- for j:=a[i-].l to a[i].l- do
- begin
- col[c[j]]:=col[c[j]]-;
- ans[a[i].s]:=ans[a[i].s]-*col[c[j]];
- end;
- end else
- for j:=a[i].l to a[i-].l- do
- begin
- ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
- col[c[j]]:=col[c[j]]+;
- end;
- inc(i);
- if i>m then break;
- end;
- end;
- for i:= to m do
- begin
- if size[i]= then all:= else all:=size[i]*(size[i]-);
- num:=gcd(ans[i],all);
- writeln(ans[i] div num,'/',all div num);
- end;
- end;
- begin
- init;
- main;
- end.
bzoj 2038 莫队算法的更多相关文章
- bzoj 2038 莫队入门
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意:多次询问区间内取出两个相同颜色的种类数 思路:由于不是在线更新,那么可以进行离线查询,而 ...
- HYSBZ 2038 莫队算法
小Z的袜子(hose) Time Limit:20000MS Memory Limit:265216KB 64bit IO Format:%lld & %llu Submit ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- 【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)(组合计数+概率+莫队算法+分块)
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 学了下莫队,挺神的orzzzz 首先推公式的话很简单吧... 看的题解是从http://for ...
- bzoj 2038 [2009国家集训队]小Z的袜子(hose)(莫队算法)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2038 [题意] 给定一个有颜色的序列,回答若干个询问:区间内任选两个颜色相同的概率. ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- bzoj 2038 A-小Z的袜子[hose] - 莫队算法
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- BZOJ 2038 小Z的袜子(hose) 莫队算法模板题
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目大意: 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...
随机推荐
- EF 4.1 一些操作
1.执行返回表类型的存储过程 Create PROCEDURE [dbo].[ProSelectStu] @StudentID int AS BEGIN Select Student.* from E ...
- vue中的重要特性
一.vue中的自定义组件 html的代码: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- Uva 1588 Kickdown
这道题思路并不难想,在做题过程中主要遇到的困难有: 因为没有仔细的考虑边界情况,没有分析全面,导致因=没有取到而得不出正确结果,浪费的大量时间. 今后在做这类题目时,一定要先进行一个比较全面的分析+模 ...
- thinkphp二维数组模板输出方法
thinkphp二维数组模板输出方法 先写个记录,有空再整理发上来
- PHP使用phpexcel读取excel文件
PHP读取excel文件 require("Classes/PHPExcel.php"); require("Classes/PHPExcel/IOFactory.php ...
- Java transient volatile关键字(转)
Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...
- js控制文本框只能输入数字 及 常用字符对应ASCII码值
方法一: <INPUT TYPE='text' NAME=text onkeypress="a()"><script language=javascript> ...
- Python脚本控制的WebDriver 常用操作 <一> 启动浏览器
由于本人的学习定位是基于Selenium+WebDriver+Python+FireFox+Eclipse+Pydev, 所以我的笔记也只和这方面相关. 我打算先学习基于Python脚本WebDriv ...
- Python学习教程(learning Python)--1.2Python输入输出与处理
一般在做Python程序设计时,通常程序的结构由三部分组成: 输入语句,主要用于输入数据: 数据处理语句,一般对数据进行算术.逻辑等运算处理操作: 输出语句,将输入或者处理结果输出,用于与用户交互. ...
- Moses更改权重的命令变化 -d -t -
-l 可以用: weight-l 或者lm (不需要在前面加-) 还是用-weight-overwrite “Distortion0= 0"更保险 reording weight i ...