Description

对于序列A,它的逆序对数定义为满足i<ji<ji,且Ai>AjAi>AjA_i>A_j的数对(i,j)(i,j)(i,j)的个数。给111到n" role="presentation" style="position: relative;">nnn的一个排列,按照某种顺序依次删除mm<script type="math/tex" id="MathJax-Element-28">m</script>个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。

Solution

非主席树做法。

考虑在原本的位置、大小的基础上,将时间看做另一维,便是一个三维偏序的问题了。

直接CDQ两次即可。

Source

/************************************************* Au: Hany01* Date: Mar 13th, 2018* Prob: [BZOJ3295][CQOI2011] 动态逆序对* Email: hany01@foxmail.com
************************************************/#include<bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
#define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i)
#define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)
#define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)
#define Set(a, b) memset(a, b, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define fir first
#define sec second
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) ((int)(a).size())
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define Mod (1000000007)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define y1 wozenmezhemecaiatemplate <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }inline int read()
{register int _, __; register char c_;for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1;for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}inline void File()
{
#ifdef hany01freopen("bzoj3295.in", "r", stdin);freopen("bzoj3295.out", "w", stdout);
#endif
}const int maxn = 100005;struct Data { int x, y, z, Ans, id; }A[maxn];
inline bool cmp1(const Data &A, const Data &B)
{if (A.x != B.x) return A.x < B.x;if (A.y != B.y) return A.y < B.y;return A.z < B.z;
}inline bool cmp2(const Data &A, const Data &B)
{if (A.y != B.y) return A.y < B.y;return A.z < B.z;
}int n, m, del[maxn], pos[maxn];
LL Ans[maxn];struct BIT
{int c[maxn];
#define lb(x) ((x) & -(x))inline void update(int x, int dt) { for ( ; x <= n; x += lb(x)) c[x] += dt; }inline int query(int x) { int Ans = 0; for ( ; x; x -= lb(x)) Ans += c[x]; return Ans; }
}bit;inline void CDQ(int l, int r)
{if (l == r) return ;int mid = (l + r) >> 1;CDQ(l, mid), CDQ(mid + 1, r);sort(A + l, A + mid + 1, cmp2), sort(A + mid + 1, A + r + 1, cmp2);int x = l, y = mid + 1;while (y <= r) {while (x <= mid && A[x].y < A[y].y) bit.update(A[x].z, 1), ++ x;A[y].Ans += bit.query(A[y].z - 1), ++ y;}For(i, l, x - 1) bit.update(A[i].z, -1);
}int main()
{File();n = read(), m = read();For(i, 1, n)A[i].z = n - read() + 1, A[i].x = i, A[i].id = i, pos[n - A[i].z + 1] = i;For(i, 1, m) A[pos[del[i] = read()]].y = n - i + 1;static int cntt = 0;For(i, 1, n) if (!A[i].y) A[i].y = ++ cntt;CDQ(1, n);For(i, 1, n) A[i].x = n - A[i].x + 1, A[i].z = n - A[i].z + 1;sort(A + 1, A + 1 + n, cmp1);CDQ(1, n);For(i, 1, n) pos[A[i].z] = i;For(i, 1, n) if (A[i].y <= n - m) Ans[m + 1] += A[i].Ans;Fordown(i, m, 1) Ans[i] = Ans[i + 1] + A[pos[del[i]]].Ans;For(i, 1, m) printf("%lld\n", Ans[i]);return 0;}
//去年花里逢君别,今日花开已一年。
//    -- 韦应物《寄李儋元锡》

【BZOJ3295】【CQOI2011】动态逆序对(CDQ分治)相关推荐

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

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

  2. BZOJ 3295: [Cqoi2011]动态逆序对 cdq分治

    https://www.lydsy.com/JudgeOnline/problem.php?id=3295 这个妹妹我曾见过的~~~ 之前应该在校内oj写了,似乎还写过题解?发现没写博客就重新水一遍代 ...

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

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

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

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

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

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

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

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

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

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

  8. 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树

    传送门 思路: 用来练习cdq的题目 断断续续纠结了2天 因为loli一直在考试 最后莫名乱搞了一发就A了? 实际上是考虑每一次修改对答案的贡献,即位置在1~x-1且大于x的数以及位置在x+1~n且小 ...

  9. 【bzoj3295】动态逆序对

    我怎么控制不住自己又写了个数据结构啊--真是的-- 其实我是想练CDQ分治的--结果忍不住又写了个主席树. 首先看看不动态的逆序对咋做?树状数组嘛. 那么删除咋搞?就是考虑贡献,把它前面比他大的,后面 ...

  10. [CQOI2011]动态逆序对

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

最新文章

  1. json jsono wsdl_记录一下json的生成
  2. tree的使用,显示行号,find命令应用
  3. P1273 有线电视网
  4. 数据结构与算法之花费铜板最小和利润最大题目
  5. Gitlab Merge Request Builder Plugin 配置小记
  6. UML图入门学习笔记
  7. Oracle命令--为数据文件缩容
  8. [HAOI2016]找相同字符
  9. 创建控制文件后的疑难解答
  10. 【poj1995】Raising Modulo Numbers
  11. 爆红Github!再来一个小白练手项目,20个项目随你造!
  12. 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解
  13. 谈谈文吹与武吹的差异
  14. 蓝桥杯c语言基础试题答案,蓝桥杯试题C语言答案.doc
  15. 信号与系统(3.1)- RLC 串联电路的零输入响应
  16. 面向未来的大数据核心技术都有什么?
  17. WPF Binding绑定模式
  18. 僵尸进程(zombie process)
  19. 20221219 圣诞节,音乐圣诞树
  20. 一个程序员要学会哪些东西,才能独立完成大的项目?

热门文章

  1. Vlan和Trank
  2. 取消word文档中某些页面的页眉
  3. Python分析【崩坏学园2】凝魔纹心所输出
  4. python执行bat文件_让Python文件也可以当bat文件运行
  5. 吉他指弹入门——双手泛音
  6. oracle结构描,轻松取得Oracle结构描述句法
  7. Android studio开发一:三个页面简单实现QQ登录界面的延时跳转
  8. 基于fabric的行业联盟链技术研究/司帅帅
  9. 京东智联云贪心科技:图卷积神经网络在推荐系统的应用
  10. w10恢复出厂设置_笔记本电脑w10怎么恢复出厂设置