• HYSBZ - 4991
  • 题意: 第一列 1-n的排列 ,第二列 1-n的排列。  相同数字连边  ,问  有多少组 数字 是有交点的并且 绝对值之差>K
    思路:处理一下 1-n 在第一列的位置,1-n在第二列的位置。按照第一列的位置从小到大排序,然后 进行cdq分治,
    因为现在第一列已经是递增序列了,如果在第二列中出现了递减那么这两个数就有交点,分治解决,递归左区间 
    的必然第一列必然小于递归右区间。所以只处理左区间对右区间的影响,两段小区间分别按照 b 从大到小排序,
    然后 统计 左区间的b  比右区间大的树状数组更新那个数字。然后更新完成之后查询, 右区间当前的数
    (绝对值之差>K无非就是, < x-k  有多少 ,  > x+k有多少)分别 树状数组进行查询,进行完成之后 ,
    数组数组恢复最初状态,回溯 继续处理大区间即可

  • #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define maxn 100010
    struct node
    {
    int num,a,b;
    } data[maxn];
    bool cp(node x,node y)
    {
    return x.a<y.a;
    };
    bool cp2(node x,node y)
    {
    return x.b>y.b;
    };
    int tree[maxn],n,k,x;
    ll ans;
    int lowbit(int x)
    {
    return x&(-x);
    }
    void add(int x,int ad)
    {
    while(x<=n)
    {
    tree[x]+=ad;
    x+=lowbit(x);
    }
    }
    int query(int x)
    {
    int re=0;
    while(x>0)
    {
    re+=tree[x];
    x-=lowbit(x);
    }
    return re;
    }
    void cdq(int l,int r)
    {
    if(l==r)return ;
    int mid=(l+r)>>1;
    cdq(l,mid);
    cdq(mid+1,r);
    sort(data+l,data+1+mid,cp2);
    sort(data+mid+1,data+1+r,cp2);
    int i=l,j=mid+1;
    for(; j<=r; j++)
    {
    while(data[i].b>data[j].b&&i<=mid)
    {
    add(data[i].num,1);
    i++;
    }
    ans+=query(data[j].num-k-1);
    if(data[j].num+k<n)ans+=query(n)-query(data[j].num+k);
    }
    for(j=l; j<i; j++)
    add(data[j].num,-1);
    }
    int main()
    {
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++)
    {
    scanf("%d",&x);
    data[i].num=i;
    data[x].a=i;
    }
    for(int j=1; j<=n; j++)
    {
    scanf("%d",&x);
    data[x].b=j;
    }
    sort(data+1,data+1+n,cp);
    cdq(1,n);
    printf("%lld\n",ans);
    return 0;
    }

      

Why Did the Cow Cross the Road III HYSBZ - 4991 -CDQ-逆序数的更多相关文章

  1. [USACO17FEB]Why Did the Cow Cross the Road III P(CDQ分治)

    题意 两列$n$的排列,相同的数连边,如果一对数有交叉且差的绝对值$>k$,则$++ans$,求$ans$ 题解 可以把每一个数字看成一个三元组$(x,y,z)$,其中$x$表示在第一列的位置, ...

  2. Why Did the Cow Cross the Road III(树状数组)

    Why Did the Cow Cross the Road III 时间限制: 1 Sec  内存限制: 128 MB提交: 65  解决: 28[提交][状态][讨论版] 题目描述 The lay ...

  3. 洛谷 P3663 [USACO17FEB]Why Did the Cow Cross the Road III S

    P3663 [USACO17FEB]Why Did the Cow Cross the Road III S 题目描述 Why did the cow cross the road? Well, on ...

  4. [USACO17FEB]Why Did the Cow Cross the Road III P

    [USACO17FEB]Why Did the Cow Cross the Road III P 考虑我们对每种颜色记录这样一个信息 \((x,y,z)\),即左边出现的位置,右边出现的位置,该颜色. ...

  5. [USACO17FEB]Why Did the Cow Cross the Road III S

    题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of ...

  6. [BZOJ4989][Usaco2017 Feb]Why Did the Cow Cross the Road 树状数组维护逆序对

    4989: [Usaco2017 Feb]Why Did the Cow Cross the Road Time Limit: 10 Sec  Memory Limit: 256 MBSubmit:  ...

  7. 洛谷 P3660 [USACO17FEB]Why Did the Cow Cross the Road III G(树状数组)

    题目背景 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi,求满足ai<aj<bi<bj的对数 题目描述 The layout of Farmer ...

  8. bzoj 4991 [Usaco2017 Feb]Why Did the Cow Cross the Road III(cdq分治,树状数组)

    题目描述 Farmer John is continuing to ponder the issue of cows crossing the road through his farm, intro ...

  9. 【题解】洛谷P3660 [USACO17FEB]Why Did the Cow Cross the Road III

    题目地址 又是一道奶牛题 从左到右扫描,树状数组维护[左端点出现而右端点未出现]的数字的个数.记录每个数字第一次出现的位置. 若是第二次出现,那么删除第一次的影响. #include <cstd ...

随机推荐

  1. cf1110d 线性dp

    很精练的一道题 /* dp[i][j][k]表示值i作为最大值结束的边剩k条,i-1剩下j条的情况的结果 dp[i][k][l]是由dp[i-1][j][k]的j决定的,因为k+l是被留下给后面用的, ...

  2. Linux基础三:linux目录结构和目录文件的浏览、管理及维护

    目录文件的浏览.管理及维护(一) 1.Linux文件系统的层次结构 1)Linux文件系统的树状结构:在Linux或UNIX操作系统中,所有的文件和目录都被组织成一个以根节点开始的倒置的树状结构. 2 ...

  3. Nginx详解八:Nginx基础篇之Nginx请求限制的配置语法与原理

    Nginx的请求限制: 连接频率的限制:limit_conn_module 配置语法:limit_conn_zone key zone=name:size;默认状态:-配置方法:http 配置语法:l ...

  4. jenkins 实现测试发布、预发布、真实发布、回滚发布

    主要思路: 1.做三个文件夹,用于放置不可随意修改的配置文件(测试发布.预发布.真实发布) 2.每次都先修改配置文件再进行构建(构建时会先把配置文件复制到构建的目录,再同步到发布的目录) 3.发布完代 ...

  5. ajax beforeSend 写的显示隐藏代码不执行

    ajax如果要写像下方格式 $.ajax({ url: ajaxurl, type: 'POST', dataType: 'json', async:true, data: { }, beforeSe ...

  6. 引用的作用&引用与指针的区别

    引入 C语言中函数有两种传参的方式: 传值和传址.以传值方式, 在函数调用过程中会生成一份临时变量用形参代替, 最终把实参的值传递给新分配的临时变量即形参. 它的优点是避免了函数调用的一些副作用, 但 ...

  7. Ubuntu下安装kate编辑器

    Ubuntu下安装kate编辑器   Ubuntu 下安装kate编辑器 #sudo apt-get install kate 安装kconsole #sudo apt-get install kco ...

  8. DapperHelper 帮助类

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  9. 实战--使用lvs实现四层负载均衡,转发到后端nginx

    这个帖子讲得很细致,基本依照这个方案实践. 只是IP是按我自己虚拟机的IP来测试的. http://www.cnblogs.com/arjenlee/p/9262737.html ========== ...

  10. NetCore 生成RSA公私钥对,公钥加密私钥解密,私钥加密公钥解密

    using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using ...