https://www.lydsy.com/JudgeOnline/problem.php?id=3295

这个妹妹我曾见过的~~~

之前应该在校内oj写了,似乎还写过题解?发现没写博客就重新水一遍代码水一篇博客好了。

把找逆序对的过程想成一个一个往里塞数字然后找每个数字可以组成的逆序对,把最后要去掉的几个也想成往里塞,所以加一个时间维度用cdq求三维偏序。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 #define LL long long
 9 #define pa pair<int,int>
10 const int maxn=100010;
11 const LL minf=(LL)5e17;
12 int n,m;
13 struct nod{
14     int t,id,v;LL ans;
15 }a[maxn];
16 int b[maxn]={},vis[maxn]={};
17 LL t[maxn]={}; int sta[maxn]={},tai=0;
18 priority_queue< pa , vector< pa > , greater< pa > >q[2];
19
20 inline void addt(int x,int v){ while(x<=n){ t[x]+=v; x+=(x&-x); } }
21 inline LL gett(int x){ LL tsn=0; while(x){ tsn+=t[x]; x-=(x&-x); } return tsn; }
22 bool mcmp1(nod aa,nod bb){
23     if(aa.id!=bb.id)return aa.id<bb.id;
24     return aa.t<bb.t;
25 }
26 bool mcmp2(nod aa,nod bb){
27     if(aa.t!=bb.t)return aa.t<bb.t;
28     return aa.id<bb.id;
29 }
30 void doit(int l,int r){
31     if(l==r)return;
32     int mid=(l+r)/2;
33     doit(l,mid); doit(mid+1,r);
34     //x被查找y查找
35     for(int i=l;i<=mid;i++)q[0].push(make_pair(a[i].t,i));
36     for(int i=mid+1;i<=r;i++)q[1].push(make_pair(a[i].t,i));
37     tai=0;
38     while(!q[1].empty()){
39         pa y=q[1].top(); q[1].pop();
40         if(q[0].empty()){a[y.second].ans+=gett(n)-gett(a[y.second].v);continue;} pa x=q[0].top();
41         while(x.first<=y.first){
42             addt(a[x.second].v,1); sta[++tai]=a[x.second].v;
43             q[0].pop(); if(q[0].empty())break; x=q[0].top();
44         }a[y.second].ans+=gett(n)-gett(a[y.second].v);
45     }
46     while(!q[0].empty())q[0].pop();
47     for(int i=1;i<=tai;i++)addt(sta[i],-1);
48
49     for(int i=l;i<=mid;i++)q[0].push(make_pair(a[i].t,i));
50     for(int i=mid+1;i<=r;i++)q[1].push(make_pair(a[i].t,i));
51     tai=0;
52     while(!q[0].empty()){
53         pa y=q[0].top(); q[0].pop();
54         if(q[1].empty()){a[y.second].ans+=gett(a[y.second].v-1);continue;} pa x=q[1].top();
55         while(x.first<=y.first){
56             addt(a[x.second].v,1); sta[++tai]=a[x.second].v;
57             q[1].pop(); if(q[1].empty())break; x=q[1].top();
58         }a[y.second].ans+=gett(a[y.second].v-1);
59     }
60     while(!q[1].empty())q[1].pop();
61     for(int i=1;i<=tai;i++)addt(sta[i],-1);
62 }
63 int main(){
64     scanf("%d%d",&n,&m);
65     for(int i=1;i<=n;i++){scanf("%d",&a[i].v);a[i].id=i;a[i].t=i;vis[a[i].v]=i;}
66     for(int i=1;i<=m;i++){scanf("%d",&b[i]);a[vis[b[i]]].t=n+m+1-i;}
67     sort(a+1,a+1+n,mcmp1); doit(1,n);
68     sort(a+1,a+1+n,mcmp2);
69     for(int i=2;i<=n;i++)a[i].ans+=a[i-1].ans;
70     for(int i=1;i<=m;i++)printf("%lld\n",a[n-i+1].ans);
71     return 0;
72 }

View Code

转载于:https://www.cnblogs.com/137shoebills/p/9060496.html

BZOJ 3295: [Cqoi2011]动态逆序对 cdq分治相关推荐

  1. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  2. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...

  3. [Luogu P3157][CQOI2011]动态逆序对 (树套树)

    题面 传送门:[CQOI2011]动态逆序对 Solution 一开始我看到pty巨神写这套题的时候,第一眼还以为是个SB题:这不直接开倒车线段树统计就完成了吗? 然后冷静思考了一分钟,猛然发现单纯的 ...

  4. 【洛谷3157】[CQOI2011] 动态逆序对(CDQ分治)

    点此看题面 大致题意: 给你一个从\(1\)到\(n\)的排列,问你每次删去一个元素后剩余的逆序对个数. 关于\(80\)分的树套树 为了练树套树,我找到了这道题目. 但悲剧的是,我的 线段树套\(T ...

  5. BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html 题目传送门 - BZOJ3295 题意 对于序列$A$,它的逆序对数定义为满足$i< ...

  6. bzoj3295:[CQOI2011]动态逆序对

    传送门 线段树套线段树会TLE+MLE! 树状数组不仅空间小,常数也小(我写的除外) 思考一下求逆序对需要的条件,树套树就过了 代码: #include<cstdio> #include& ...

  7. [CQOI2011]动态逆序对

    emmm 显然的考虑影响 后面比x小的 前面比x大的 还要单点修改 只有树套树了. 暴力无脑线段树套fhq 会TLE到80pts 单点修改,区间查询 树状数组套动态开点线段树显然更优啊 2781ms ...

  8. HYSBZ - 3295  动态逆序对 (cdq分治)

    F - 动态逆序对 HYSBZ - 3295 题目大意:给出一个序列有m个询问,每一个询问要求输出当前的逆序对数量后在原序列中删除该数字. 解题思路:如果将删除倒着做就变成了插入.没插入一个数字我们就 ...

  9. 【Luogu1393】动态逆序对(CDQ分治)

    [Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...

最新文章

  1. 寻找冬日里的流量美食,发现了李子柒走红的秘密
  2. Odd Grasshopper 奇偶找规律
  3. HTML自动换行的问题
  4. OnScrollListener
  5. java for 变量赋值_Java 如何引用变量赋值?
  6. 安川机器人dx200编程手册_安川DX100DX200通信接口手册
  7. 修改APP默认横屏或竖屏
  8. 针对浏览器主页被360或hao123锁定的解决方法
  9. QT自定义Widget实现鼠标拖动窗口移动位置及鼠标拖拽窗口边缘窗口大小改变
  10. HZAU 1001 Handing Out Candies
  11. html根据ip和mac地址,关于怎么通过IE浏览器获取客户端的IP地址和Mac地址
  12. 苹果电脑破音的解决办法
  13. 怎么把知网下载的caj格式论文转成wrod格式呢
  14. python基础 -34- 面向对象(动态生成一个类)
  15. R语言导入txt文本报错:more columns than column names(列的数目比列的名字要多)问题解决
  16. 如何使用 开源硬件Banana PI BPI-R2‘s GPIO-s
  17. FAT32转NTFS、NTFS无损转FAT32
  18. android开发教程21篇(强烈推荐,几乎每一篇都是精华教程)
  19. [LQR简要快速入门]+[一级倒立摆的LQR控制]
  20. java的类是什么_java类是什么意思

热门文章

  1. python中发送带附件的邮件,python SMTP实现发送带附件电子邮件
  2. linux内核计算list的长度,Linux内核通用链表 linux/list.h阅读
  3. python股票数据分析实验报告_Python实验报告
  4. nvidia控制面板点了没反应win7_win7系统Nvidia控制面板怎么设置?
  5. LeetCode算法入门- Add Two Numbers-day3
  6. java读取mysql配置文件_Linux运维:MySQL读写分离解决方案
  7. 腾讯x5加载本地html乱码,腾讯X5内核播放器遇到的问题
  8. vue内检测是否有swiper_vue.js怎么用swiper
  9. php封装redis类,php封装redis操作类
  10. java日常笔记、对象的创建完全是由构造方法实现的吗?this的本质