莫队算法,具体的可以看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)

  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Accepted
  6.     Time: ms
  7.     Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. type
  12.     rec                         =record
  13.         l, r, w, s              :longint;
  14.     end;
  15.      
  16. var
  17.  
  18.     n, m                        :longint;
  19.     c, size                     :array[..] of int64;
  20.     len                         :longint;
  21.     a                           :array[..] of rec;
  22.     now                         :longint;
  23.     col, ans                    :array[..] of int64;
  24.     all, num                    :int64;
  25.      
  26. procedure swap(var a,b:longint);
  27. var
  28.     c                           :longint;
  29. begin
  30.     c:=a; a:=b; b:=c;
  31. end;
  32.  
  33. procedure swap_rec(var a,b:rec);
  34. var
  35.     c                           :rec;
  36. begin
  37.     c:=a; a:=b; b:=c;
  38. end;
  39.  
  40. function gcd(a,b:int64):int64;
  41. begin
  42.     if a<b then exit(gcd(b,a)) else
  43.     if b= then exit(a) else exit(gcd(b,a mod b));
  44. end;
  45.  
  46. procedure qs(low,high:longint);
  47. var
  48.     i, j, xx, yy                :longint;
  49. begin
  50.     i:=low; j:=high; xx:=a[(i+j) div ].w;
  51.     yy:=a[(i+j) div ].r;
  52.     while i<j do
  53.     begin
  54.         while (a[i].w<xx) or (a[i].w=xx) and (a[i].r<yy) do inc(i);
  55.         while (a[j].w>xx) or (a[j].w=xx) and (a[j].r>yy) do dec(j);
  56.         if i<=j then
  57.         begin
  58.             swap_rec(a[i],a[j]);
  59.             inc(i); dec(j);
  60.         end;
  61.     end;
  62.     if i<high then qs(i,high);
  63.     if j>low then qs(low,j);
  64. end;
  65.      
  66. procedure init;
  67. var
  68.     i                           :longint;
  69.      
  70. begin
  71.     read(n,m);
  72.     for i:= to n do read(c[i]);
  73.     len:=trunc(sqrt(m));
  74.     for i:= to m do
  75.     begin
  76.         read(a[i].l,a[i].r);
  77.         if a[i].l>a[i].r then swap(a[i].l,a[i].r);
  78.         size[i]:=a[i].r-a[i].l+;
  79.         a[i].w:=a[i].l div len+;
  80.         a[i].s:=i;
  81.     end;
  82.     qs(,m);
  83. end;
  84.      
  85. procedure main;
  86. var
  87.     i, j                        :longint;
  88. begin
  89.     i:=;
  90.     while i<=m do
  91.     begin
  92.         now:=a[i].w;
  93.         fillchar(col,sizeof(col),);
  94.         for j:=a[i].l to a[i].r do
  95.         begin
  96.             ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
  97.             col[c[j]]:=col[c[j]]+;
  98.         end;
  99.         inc(i);
  100.         while a[i].w<=now do
  101.         begin
  102.             ans[a[i].s]:=ans[a[i-].s];
  103.             for j:=a[i-].r+ to a[i].r do
  104.             begin
  105.                 ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
  106.                 col[c[j]]:=col[c[j]]+;
  107.             end;
  108.             if a[i-].l<a[i].l then
  109.             begin
  110.                 for j:=a[i-].l to a[i].l- do
  111.                 begin
  112.                     col[c[j]]:=col[c[j]]-;
  113.                     ans[a[i].s]:=ans[a[i].s]-*col[c[j]];
  114.                 end;
  115.             end else
  116.                 for j:=a[i].l to a[i-].l- do
  117.                 begin
  118.                     ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
  119.                     col[c[j]]:=col[c[j]]+;
  120.                 end;
  121.             inc(i);
  122.             if i>m then break;
  123.         end;
  124.     end;
  125.     for i:= to m do
  126.     begin
  127.         if size[i]= then all:= else all:=size[i]*(size[i]-);
  128.         num:=gcd(ans[i],all);
  129.         writeln(ans[i] div num,'/',all div num);
  130.     end;
  131. end;
  132.      
  133.      
  134. begin
  135.     init;
  136.     main;
  137. end.

bzoj 2038 莫队算法的更多相关文章

  1. bzoj 2038 莫队入门

    http://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意:多次询问区间内取出两个相同颜色的种类数 思路:由于不是在线更新,那么可以进行离线查询,而 ...

  2. HYSBZ 2038 莫队算法

    小Z的袜子(hose) Time Limit:20000MS     Memory Limit:265216KB     64bit IO Format:%lld & %llu Submit  ...

  3. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  4. 【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)(组合计数+概率+莫队算法+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2038 学了下莫队,挺神的orzzzz 首先推公式的话很简单吧... 看的题解是从http://for ...

  5. bzoj 2038 [2009国家集训队]小Z的袜子(hose)(莫队算法)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2038 [题意] 给定一个有颜色的序列,回答若干个询问:区间内任选两个颜色相同的概率. ...

  6. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9894  Solved: 4561[Subm ...

  7. bzoj 2038 A-小Z的袜子[hose] - 莫队算法

    作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...

  8. BZOJ 2038 小Z的袜子(hose) 莫队算法模板题

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目大意: 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中 ...

  9. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...

随机推荐

  1. EF 4.1 一些操作

    1.执行返回表类型的存储过程 Create PROCEDURE [dbo].[ProSelectStu] @StudentID int AS BEGIN Select Student.* from E ...

  2. vue中的重要特性

    一.vue中的自定义组件 html的代码: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  3. Uva 1588 Kickdown

    这道题思路并不难想,在做题过程中主要遇到的困难有: 因为没有仔细的考虑边界情况,没有分析全面,导致因=没有取到而得不出正确结果,浪费的大量时间. 今后在做这类题目时,一定要先进行一个比较全面的分析+模 ...

  4. thinkphp二维数组模板输出方法

    thinkphp二维数组模板输出方法 先写个记录,有空再整理发上来

  5. PHP使用phpexcel读取excel文件

    PHP读取excel文件 require("Classes/PHPExcel.php"); require("Classes/PHPExcel/IOFactory.php ...

  6. Java transient volatile关键字(转)

    Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...

  7. js控制文本框只能输入数字 及 常用字符对应ASCII码值

    方法一: <INPUT TYPE='text' NAME=text onkeypress="a()"><script language=javascript> ...

  8. Python脚本控制的WebDriver 常用操作 <一> 启动浏览器

    由于本人的学习定位是基于Selenium+WebDriver+Python+FireFox+Eclipse+Pydev, 所以我的笔记也只和这方面相关. 我打算先学习基于Python脚本WebDriv ...

  9. Python学习教程(learning Python)--1.2Python输入输出与处理

    一般在做Python程序设计时,通常程序的结构由三部分组成: 输入语句,主要用于输入数据: 数据处理语句,一般对数据进行算术.逻辑等运算处理操作: 输出语句,将输入或者处理结果输出,用于与用户交互. ...

  10. Moses更改权重的命令变化 -d -t -

    -l  可以用: weight-l 或者lm  (不需要在前面加-)   还是用-weight-overwrite “Distortion0= 0"更保险 reording weight i ...