调了好久。。。。

转化成三维偏序,cdq处理。

好像比较快?

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 300500
using namespace std;
long long n,m,x,a[maxn],pos[maxn],f1[maxn],f2[maxn],t[maxn],ans=;
struct pnt
{
long long a,b,c,ans;
}p[maxn];
bool cmp1(pnt x,pnt y) {return x.b<y.b;}
bool cmp2(pnt x,pnt y) {return x.b>y.b;}
bool cmp3(pnt x,pnt y) {return x.a<y.a;}
long long lowbit(long long x) {return (x&(-x));}
void add(long long x,long long val)
{
for (long long i=x;i<=n;i+=lowbit(i))
t[i]+=val;
}
long long ask(long long x)
{
long long ret=;
for (long long i=x;i>=;i-=lowbit(i))
ret+=t[i];
return ret;
}
void cdq1(long long left,long long right)
{
long long mid=left+right>>;
sort(p+left,p+mid+,cmp1);sort(p+mid+,p+right+,cmp1);
long long i=left,j=mid+;
while (j<=right)
{
while ((i<=mid) && (p[i].b<p[j].b))
{
add(p[i].c,);
i++;
}
p[j].ans+=ask(n)-ask(p[j].c);
j++;
}
for (long long j=left;j<i;j++) add(p[j].c,-);
}
void cdq2(long long left,long long right)
{
long long mid=left+right>>;
sort(p+left,p+mid+,cmp2);sort(p+mid+,p+right+,cmp2);
long long i=left,j=mid+;
while (j<=right)
{
while ((i<=mid) && (p[i].b>p[j].b))
{
add(p[i].c,);
i++;
}
p[j].ans+=ask(p[j].c-);
j++;
}
for (long long j=left;j<i;j++) add(p[j].c,-);
}
void cdq(long long left,long long right)
{
if (left==right) return;
long long mid=left+right>>;
cdq(left,mid);cdq(mid+,right);
cdq1(left,right);
cdq2(left,right);
}
int main()
{
scanf("%lld%lld",&n,&m);
for (long long i=;i<=n;i++)
{
scanf("%lld",&a[i]);
pos[a[i]]=i;
}
for (long long i=;i<=n;i++)
{
f1[pos[i]]=(pos[i]-)-ask(pos[i]-);
ans+=f1[pos[i]];
f2[pos[i]]=ask(n)-ask(pos[i]);
add(pos[i],);
}
memset(t,,sizeof(t));
for (long long i=;i<=m;i++)
{
scanf("%lld",&x);
p[i].a=i;p[i].b=pos[x];p[i].c=x;
}
cdq(,m);
sort(p+,p+m+,cmp3);
for (long long i=;i<=m;i++)
{
printf("%lld\n",ans);
x=p[i].c;
ans-=(f1[pos[x]]+f2[pos[x]]);
ans+=(p[i].ans);
}
return ;
}

BZOJ 3295 动态逆序对的更多相关文章

  1. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

  2. bzoj 3295 动态逆序对 (三维偏序,CDQ+树状数组)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 思路: 可以将这道题看成倒着插入,这样就可以转化成求逆序对数,用CDQ分治降维,正反用 ...

  3. bzoj 3295 动态逆序对 CDQ分支

    容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...

  4. BZOJ - 3295 动态逆序对 (树状数组套treap)

    题目链接 思路和bzoj2141差不多,不过这道题的数据更强一些,线段树套treapT了,树状数组套treap卡过~~ #include<bits/stdc++.h> using name ...

  5. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  6. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  7. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  8. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

  9. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

    3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...

随机推荐

  1. ArrayList和Iterator的用法

    import java.util.ArrayList; import java.util.Iterator; public class ArrayListTest { public static vo ...

  2. ZOJ3554 A Miser Boss(dp)

    给你n个工件,然后有A,B,C三个工厂,然后它们加工第i个工件所需要的时间分别为a[i],b[i],c[i],然后现在要你利用三间工厂加工所有的零件,要求是任何时间工厂都不能停工,而且一定要三间同时做 ...

  3. AsyncTask和Handler对比

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...

  4. TCP套接字编程

    一.套接字(socket)函数 图1给出了在一个TCP客户与服务器通信的流程.服务器首先启动,稍后某个客户启动,它试图连接到服务器.假设客户给服务器发送一个请求,服务器处理该请求,并且给客户发回一个相 ...

  5. java cookie

    public static void AddCookie(HttpServletResponse response, String key, String value) { Cookie cookie ...

  6. java系统属性

    java系统属性 1. java.runtime.name:java的运行环境名称. 2. sun.boot.library.path:jdk\jre中的bin的路径 3. java.vm.versi ...

  7. svn教程

    安装过程: 1.下载软件后,双击程序进行安装,点击“Next”: 2.在许可证协议页面,选择“I Accept the terms in the License Agreement”,点击“Next” ...

  8. loadrunner之Paramater在负载测试中的数据生成规则

    前段时间在做性能测试的时候,基于业务的需求,使用到了Unique Number的参数类型. 脚本的业务是注册以alien开头,后面接数字的用户帐号,填写相关帐号信息.提交企业信息进行审核. 其中用户帐 ...

  9. asp.net dataTable添加列

    DataTable dtNew = new DataTable(); dtNew.Columns.Add("ItemNo");//序列号列 dtNew.Columns.Add(&q ...

  10. iphone 异常捕获处理

    iphone 异常捕获处理 1 void UncaughtExceptionHandler(NSException *exception) { 2 NSArray *arr = [exception ...