bzoj 3295 CDQ求动态逆序对
- #include<bits/stdc++.h>
- #define LL long long
- #define fi first
- #define se second
- #define mk make_pair
- #define PII pair<int, int>
- #define PLI pair<LL, int>
- #define PLL pair<LL, LL>
- #define y1 skldjfskldjg
- #define y2 skldfjsklejg
- using namespace std;
- const int N = 1e5 + ;
- const int M = 1e5 + ;
- const int inf = 0x3f3f3f3f;
- const LL INF = 0x3f3f3f3f3f3f3f3f;
- const int mod = 1e9 +;
- const double PI = acos(-);
- const double eps = 1e-;
- int n, m, pos[N], R[N], L[N];
- LL ans[N];
- struct BIT {
- int a[N];
- void modify(int x, int v) {
- for(int i = x; i <= n; i += i & -i)
- a[i] += v;
- }
- int sum(int x) {
- int ans = ;
- for(int i = x; i; i -= i & -i)
- ans += a[i];
- return ans;
- }
- } bit;
- struct QUS {
- int t, x, val;
- } qus[N], tmp[N];
- void cdq(int l, int r) {
- if(l == r) return;
- int mid = l + r >> ;
- cdq(l, mid); cdq(mid + , r);
- int j = l;
- for(int i = mid + ; i <= r; i++) {
- while(j <= mid && qus[j].x < qus[i].x) bit.modify(qus[j++].val, );
- L[qus[i].t] += bit.sum(n) - bit.sum(qus[i].val);
- }
- for(int i = j - ; i >= l; i--) bit.modify(qus[i].val, -);
- j = mid;
- for(int i = r; i >= mid + ; i--) {
- while(j >= l && qus[j].x > qus[i].x) bit.modify(qus[j--].val, );
- R[qus[i].t] += bit.sum(qus[i].val - );
- }
- for(int i = j + ; i <= mid; i++) bit.modify(qus[i].val, - );
- int tot = l, p = l, q = mid + ;
- while(p <= mid && q <= r) {
- if(qus[p].x < qus[q].x) tmp[tot++] = qus[p++];
- else tmp[tot++] = qus[q++];
- }
- while(p <= mid) tmp[tot++] = qus[p++];
- while(q <= r) tmp[tot++] = qus[q++];
- for(int i = l; i <= r; i++) qus[i] = tmp[i];
- }
- int main() {
- scanf("%d%d", &n, &m);
- for(int i = ; i <= n; i++) {
- int val; scanf("%d", &val);
- pos[val] = i;
- }
- int idx = n;
- for(int i = ; i <= m; i++) {
- int val; scanf("%d", &val);
- qus[idx].val = val;
- qus[idx].t = idx;
- qus[idx--].x = pos[val];
- pos[val] = -;
- }
- for(int i = ; i<= n; i++) {
- if(pos[i] != -) {
- qus[idx].val = i;
- qus[idx].t = idx;
- qus[idx--].x = pos[i];
- pos[i] = -;
- }
- }
- cdq(, n);
- for(int i = ; i <= n; i++) ans[i] = ans[i - ] + R[i] + L[i];
- for(int i = n; i > n - m; i--) printf("%lld\n", ans[i]);
- return ;
- }
- /*
- */
bzoj 3295 CDQ求动态逆序对的更多相关文章
- BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...
- 洛谷P1393 动态逆序对(CDQ分治)
传送门 题解 听别人说这是洛谷用户的双倍经验啊……然而根本没有感觉到……因为另外的那题我是用树状数组套主席树做的……而且莫名其妙感觉那种方法思路更清晰(虽然码量稍稍大了那么一点点)……感谢Candy大 ...
- BZOJ 3295 动态逆序对 | CDQ分治
BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )
hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
随机推荐
- C. Line (扩展欧几里得)
C. Line time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- bzoj 1564 [NOI2009]二叉查找树 区间DP
[NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 906 Solved: 630[Submit][Status][Discu ...
- HDU1024 最大m子段和
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- python内置函数lambda、filter、map、reduce
lambda匿名函数 1.lambda只是一个表达式,函数体比def简单多. 2.lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去 3.lambda函数 ...
- HDU 2577 How to Type (字符串处理)
题目链接 Problem Description Pirates have finished developing the typing software. He called Cathy to te ...
- js中三种定义变量 const, var, let 的区别
js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...
- hdu 1272 小希的迷宫(并查集+最小生成树+队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...
- adb端口被占用解决
解决ADB端口占用问题 方式一5037为adb默认端口,若5037端口被占用,查看占用端口的进程PIDC:\Users\wwx229495>netstat -aon|findstr 5037 ...
- 【Git/GitHub学习笔记】基本操作——创建仓库,本地、远程同步等
近日想分享一些文件,但是用度盘又太麻烦了(速度也很恶心).所以突发奇想去研究了下GitHub的仓库,这篇文章也就是一个最最最基础的基本操作.基本实现了可以在GitHub上存储文本信息与代码. 由于我的 ...
- ubuntu下定时弹窗记录工作日志
背景 记录工作日志,是一个很好的习惯,但不容易坚持,本来打算每天记录,但经常拖延,拖着拖着,有一些事情就忘记了. 等到写周报或月报的时候,才会开始翻邮件,聊天记录,各个仓库的提交log等,回忆都干了些 ...