luogu P1393 P3157 动态逆序对
传送门
另一个在推荐的相关题目里有
删除不好删 反过来变成加 都是基本操作
然后被删的数加一维就是时间
然后时间第一维 序号第二维 权值第三维
开一个权值树状数组维护三维偏序就行
两个题要注意输入的时候一个是删掉的权值 一个是删掉的编号
然后如果开不下要离散化
Code:
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #define rep(i,a,n) for(int i = a;i <= n;++i) 6 #define per(i,n,a) for(int i = n;i >= a;--i) 7 using namespace std; 8 typedef long long ll; 9 ll read() { 10 ll as = 0,fu = 1; 11 char c = getchar(); 12 while(c < '0' || c > '9') { 13 if(c == '-') fu = -1; 14 c = getchar(); 15 } 16 while(c >= '0' && c <= '9') { 17 as = as * 10 + c - '0'; 18 c = getchar(); 19 } 20 // printf("#%d\n",as); 21 return as * fu; 22 } 23 const int N = 100005; 24 //head 25 int n,Q; 26 struct node { 27 int x,idx,tim; 28 bool operator < (const node &o) const { 29 return tim < o.tim || (tim == o.tim && idx < o.idx); 30 } 31 } a[N],tmp[N]; 32 int b[N],ans[N]; 33 34 int t[N]; 35 void upd(int x,int k) { 36 for(int i = x;i <= n;i += (i & (-i))) t[i] += k; 37 } 38 int qry(int x) { 39 int sum = 0; 40 for(int i = x;i;i -= (i & (-i))) sum += t[i]; 41 return sum; 42 } 43 44 45 void CDQ(int l,int r) { 46 if(l == r) return; 47 int m = l+r >> 1,p1,p2; 48 CDQ(l,m),CDQ(m+1,r); 49 50 p1 = l,p2 = m+1; 51 rep(i,l,r) { 52 if(p1 <= m && (p2 > r || a[p1].idx < a[p2].idx)) 53 tmp[i] = a[p1],upd(a[p1].x,1),p1++; 54 else tmp[i] = a[p2],ans[tmp[i].tim] += qry(n) - qry(a[p2].x),p2++; 55 } 56 rep(i,l,m) upd(a[i].x,-1); 57 58 p1 = m,p2 = r; 59 rep(i,l,r) { 60 if(p1 >= l && (p2 == m || (a[p1].idx > a[p2].idx))) 61 upd(a[p1].x,1),p1--; 62 else ans[a[p2].tim] += qry(a[p2].x-1),p2--; 63 } 64 rep(i,l,m) upd(a[i].x,-1); 65 66 rep(i,l,r) a[i] = tmp[i]; 67 } 68 69 int main() { 70 n = read(),Q = read(); 71 rep(i,1,n) { 72 a[i].x = read(); 73 a[i].idx = b[a[i].x] = i; 74 a[i].tim = 1; 75 } 76 rep(i,1,Q) a[b[read()]].tim = n-i+1; 77 sort(a+1,a+n+1),CDQ(1,n); 78 int tot = 0; 79 rep(i,1,n) tot += ans[i]; 80 per(i,n,n - Q + 1) printf("%lld\n",tot),tot -= ans[i]; 81 return 0; 82 }
转载于:https://www.cnblogs.com/yuyanjiaB/p/10094920.html
luogu P1393 P3157 动态逆序对相关推荐
- P3157 动态逆序对 ,树状数组套动态开点线段树
题目 洛谷题目链接 题解 在求整体的逆序对的数量时,很好办,直接用树状数组处理即可,不过在这时,我们还需要处理出一个数组pa[]pa[]pa[],其中pa[i]pa[i]pa[i]代表在区间[1,i) ...
- [Luogu P3157][CQOI2011]动态逆序对 (树套树)
题面 传送门:[CQOI2011]动态逆序对 Solution 一开始我看到pty巨神写这套题的时候,第一眼还以为是个SB题:这不直接开倒车线段树统计就完成了吗? 然后冷静思考了一分钟,猛然发现单纯的 ...
- P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...
- 【Luogu1393】动态逆序对(CDQ分治)
[Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...
- HYSBZ - 3295 动态逆序对 (cdq分治)
F - 动态逆序对 HYSBZ - 3295 题目大意:给出一个序列有m个询问,每一个询问要求输出当前的逆序对数量后在原序列中删除该数字. 解题思路:如果将删除倒着做就变成了插入.没插入一个数字我们就 ...
- 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...
- P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P3157 题目大意 一个长度为nnn序列,每次删除一个数,求删除前的逆序对数量. 解题思路 时光倒流之后,我们变为每 ...
- 【bzoj3295】动态逆序对
我怎么控制不住自己又写了个数据结构啊--真是的-- 其实我是想练CDQ分治的--结果忍不住又写了个主席树. 首先看看不动态的逆序对咋做?树状数组嘛. 那么删除咋搞?就是考虑贡献,把它前面比他大的,后面 ...
- UVA 11990 ``Dynamic'' Inversion 动态逆序对
``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...
最新文章
- LeetCode 7. 整数反转 Reverse Integer 官网答案的条件判定的一点思考
- CodeIgniter类库
- 如何判断一个字符串在JavaScript中是否包含某个字符?
- CS224W图机器学习课,斯坦福大牛主讲 | 视频、课件
- 在进行正式托管之前,服务器托管用户需要做哪些准备?
- 利用snmptools实现cacti自定义监控Windows性能计数器
- 动画学信奥 漫画学算法 CSP-J入门级 (一)、计算机基础与编程环境(依据「NOI大纲」)
- 计算机毕业设计之微信小程序的点餐系统 网上订餐app的论文
- war包的解压与打包
- alpha-beta剪枝算法
- mysql英雄联盟卡_MySQL学习之路:爬取英雄联盟数据后续使用
- 产业互联网周报 | 上海数交所:数据产品交易额预计全年超过1亿元;Zoom单季度净利润同比下降86%;...
- 知道Unicode表的数字,怎么用java推出相对应的日文?
- 日常微博营销技巧究竟有哪些呢?
- 十八个关于推荐使用IntBell网络电话软件的理由
- 新版kali如何配置IP地址?
- APICloud AVM框架开发消防检查助手APP
- y7000p 2020 vbios_2020年冬季千元环300公里上笼验资明细-长沙市南湖赛鸽俱乐部
- 一个简单的一千行冒险游戏
- 补学图论算法:算法竞赛入门经典(第二版)第十一章: