[bzoj] 3295 动态逆序对 || CDQ分治

原题

给1到n的一个排列,按照某种顺序依次删除m个元素,求每删除一个元素之前统计整个序列的逆序对数。


CDQ板题。因为删除不好处理,所以将其反过来,变为每次添加。每个数都赋予一个添加时间,每次”删除“操作后都是一次询问操作。
三维分别为时间,位置,大小。
某个元素加入后产生的贡献为时间更小、位置更小、数更大的个数 + 时间更小、位置更大、数更小的个数。

#include<cstdio>
#include<algorithm>
#define N 1000010
typedef long long ll;
using namespace std;
struct hhh
{
    ll pos,w,tm;
    bool operator < (const hhh &b) const
    {
        return tm<b.tm;
    }
}p[N];
ll n,m,ans[N],f[N],x;

bool cmp(hhh a,hhh b)
{
    return a.w>b.w;
}

ll read()
{
    ll ans=0,fu=1;
    char j=getchar();
    for (;j<'0' || j>'9';j=getchar()) if (j=='-') fu=-1;
    for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
    return ans*fu;
}

void add(int x,int y)
{
    while (x<=n) f[x]+=y,x+=x&-x;
}

ll query(int x)
{
    int ans=0;
    while (x) ans+=f[x],x-=x&-x;
    return ans;
}

void solve(int l,int r)
{
    if (l==r) return ;
    int mid=(l+r)>>1;
    solve(l,mid);
    solve(mid+1,r);
    sort(p+l,p+mid+1,cmp);
    sort(p+mid+1,p+r+1,cmp);
    int ll=l,rr=mid+1;
    while (rr<=r)
    {
    while (ll<=mid && p[ll].w>p[rr].w)
        add(p[ll].pos,1),ll++;
    ans[p[rr].tm]+=query(p[rr].pos);
    rr++;
    }
    while (--ll>=l) add(p[ll].pos,-1);//clear
    ll=mid;
    rr=r;
    while (rr>mid)
    {
    while (ll>=l && p[ll].w<p[rr].w)
        add(p[ll].pos,1),ll--;
    ans[p[rr].tm]+=query(n)-query(p[rr].pos);
    rr--;
    }
    while (++ll<=mid) add(p[ll].pos,-1);
}

int main()
{
    n=read();
    m=read();
    for (int i=1;i<=n;i++)
    {
    x=read();
    p[x].w=x;
    p[x].pos=i;
    }
    for (int i=1;i<=m;i++)
    {
    x=read();
    p[x].tm=n-i+1;//插入时间,倒叙按插入处理
    }
    for (int i=1,cnt=1;i<=n;i++)
    if (!p[i].tm) p[i].tm=cnt++;
    sort(p+1,p+n+1);
    solve(1,n);
    for (int i=2;i<=n;i++)
    ans[i]+=ans[i-1];
    for (int i=n;i>n-m;i--)
    printf("%lld\n",ans[i]);
    return 0;
}

转载于:https://www.cnblogs.com/mrha/p/8057728.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值