首页 > TAG信息列表 > P3157

P3157 [CQOI2011]动态逆序对 题解

题目大意 给出一个序列,之后删除\(M\) 个点,求删除每个点后的逆序对数 P3157 [CQOI2011]动态逆序对 solve 这道题的解法很多,我就用比较优秀的cdq解法 根据逆序对的定义,产生贡献的点对 \((i,j)\) 满足 \(T_i<T_j \& A_i>A_j \& X_i<X_j\) 或者 \(T_i<T_j \& A_i<A_j \& X_i>X_j\) 于

【ybt金牌导航6-5-4】【luogu P3157】动态逆序对(CDQ分治)(树状数组)

动态逆序对 题目链接:ybt金牌导航6-5-4 / luogu P3157 题目大意 给你一个排列,每次会删去一些数,然后问你每次删去前这个数组的逆序对数。 思路 首先如果没有删去,我们就直接一个树状数组就好了。 但是它会不断删去,那你考虑删去一个数的时候贡献会减少多少。 那我们分两种情况,一种是在

洛谷 P3157 [CQOI2011]动态逆序对

扯 好像距离上次写题解已经有百年之久了……来更新个吧。 我吹爆 gyh! 题意 给定一个 \(1\sim n\) 的排列,按照题目给定顺序依次删除 \(m\) 个数。 求每次删数前整个序列中的逆序对数。 \(1\le n\le 10^5,1\le m\le 5\times 10^4\) 思路 cdq 分治 将询问离线,并反转序列,将序列删

洛谷P3157 [CQOI2011]动态逆序对

题目大意: 给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量 基本套路:删边变加边 那么我们不就是求满足\(pos_i<pos_j,tim_i<tim_j,num_i>num_j\)的数量嘛 先按\(tim\)排序,然后归并\(pos_i\),树状数组\(num_i\) 不过这道题我们

P3157 [CQOI2011]动态逆序对 cdq分治

       删除的话可以反过来看   看作是插入   这样就成了一个正常序列的操作 按照时间cdq分治即可    注意答案要进行前缀和  因为得出的是某个元素的点对   要求的是整个序列的 #include<bits/stdc++.h>using namespace std;#define rep(i,a,b) for(int i=(a);i<=(b)

P3157 动态逆序对 CDQ分治

动态逆序对 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3157 题意: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 题解: 这个题是告诉你如何将

题解-P3157 [CQOI2011]动态逆序对

树状数组套线段树,用动态开点线段树。此类就这一题放在这吧。 程序写的太丑了,不要介意。 #include<iostream>#include<cstdio>using namespace std;typedef long long i64;const int N=1e5+5;const int S=1e7+7;int a[N],p[N];int q[N];bool b[N];int r[N];int cnt,x[S],c[S][2];i6

洛谷P3157动态逆序对

思路就是对于每一个删除的数,统计在它之前有多少比它大,在它之后有多少比它小。然后直接想到树套树(实际上是想不到更好的方法),然而树套树极其难写,所以发一个归并树的题解吧。归并树是对于线段树每一个节点,维护一个从L到R的有序数组(一般用vector实现防止MLE),有点像归并排序的过程。对于