莫队算法,具体的可以看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 莫队算法的更多相关文章

  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. pjax 历史管理 jQuery.History.js

    更新 http://www.bootcdn.cn/jquery.pjax/ 简介 pjax是一个jQuery插件,使用ajax和pushState技术提供快速的浏览体验与真正的永久链接.网页标题.以及 ...

  2. nginx安装 nginx: [emerg] getpwnam(“www”) failed 错误

    inux 64系统中安装nginx1.3时如果出现错误:nginx: [emerg] getpwnam(“www”) failed解决方法1:      在nginx.conf中 把user nobo ...

  3. C语言-L Buffer is too small && 0 解决方法

    问题如下: 问题出在程序语句(见下): 其中,字符串p1和p2分别指向某个字符串,p是定义的一个字符数组.问题出现在对strlen()的使用,这个函数计算的字符串长度是不包括'\0'的,所以在设置第二 ...

  4. 生日蛋糕 (codevs 1710) 题解

    [问题描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri,高度为Hi的圆柱 ...

  5. windows下python+flask环境配置详细图文教程

    本帖是本人在安装配置python和flask环境时所用到的资源下载及相关的教程进行了整理罗列,来方便后面的人员,省去搜索的时间.如果你在安装配置是存在问题可留言给我. 首先罗列一下python+fla ...

  6. 【设计模式】策略模式 (Strategy Pattern)

    策略模式是一种很简单的基础模式,用于封装一系列算法,使客户端的访问独立于算法的实现.我们可以”井中取水”来形象的描述策略模式.“取水”是一个动作,完成这个动作的方式有很多中,可以直接用手提.可以用水车 ...

  7. equals函数

    equals函数在Object类当中,而Object类是所有类的父类,所以所有的类里面都有equals函数. “==”操作符之前用于比较两个基本数据类型的值是否相等,而对于引用数据类型,“==”操作符 ...

  8. 【转】SQLite提示database disk image is malformed的解决方法

    SQLite有一个很严重的缺点就是不提供Repair命令. 导致死亡提示database disk image is malformed 它的产生有很多种可能,比如,磁盘空间不足,还有就是写入数据过程 ...

  9. linux rm 命令

    1.命令格式: rm [选项] 文件… 2.命令功能: 删除一个目录中的一个或多个文件或目录,如果没有使用- r选项,则rm不会删除目录.如果使用 rm 来删除文件,通常仍可以将该文件恢复原状. 3. ...

  10. ORA-01078、ORA-01565、ORA-17503、ORA-29701

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - ...