首页 > TAG信息列表 > CQOI2011

[CQOI2011] 动态逆序对

题目大意 给一个排列,删除\(m\)个元素,每删一个前,输出逆序对个数。 \(\text{Solution}\) 一道较为简单的\(CDQ\)分治,考虑每删一个数,后逆序对数个数的变化,即上次的\(ans\)减删除数前比他大的,后比他小的。 那么我们可以静态的求这个数,给每一个数加一个消失时间\(T_i\),当\(T_i > T_j\)

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\) 于

[CQOI2011]动态逆序对

Link Description 给定一个排列,每次删除一个元素,输出当前逆序对个数。 Solution 原序列的逆序对个数很好求。现在考虑删除一个数对答案的贡献。对每个元素,我们记一个它的大小 \(v\),它在序列中的位置下标 \(pos\),它被删除的时间 \(t\),对于没有被删除的元素,其删除时间设为 \(m+1\),即

洛谷 P3157 [CQOI2011]动态逆序对

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

【CQOI2011】动态逆序对

分析 近乎裸的 \(cdq\) 分治数点问题 我们考虑一个数被删去,它对删后区间逆序对个数的影响就是减去现存序列中前面比它大的个数再减去现存序列中后面比它小的个数 那么我们考虑如何处理时间限制 既然是“现存序列中”,也就是说删去时间比它晚的 那么能产生贡献的数对 \((i,j)\) 就

[CQOI2011] 放棋子 - 计数dp

在一个 \(m\) 行 \(n\) 列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列,有多少种方法? Solution 设 \(f[i][j][k]\) 表示用前 \(k\) 种颜色的棋子,占领了 \(i\) 行 \(j\) 列的方案数 设 \(g[i][j][k]\) 表示用任意 \(k\) 个同色棋子占

[BZOJ3295][CQOI2011]动态逆序对(cdq分治+树状数组)

Solution 此题可以十分简单粗暴地套用树状数组套主席树的模板。 或者:cdq分治。 此题中,原先给出一个数列,之后会删除一些数。但是,呃,删除操作好像有点儿麻烦。反正允许离线,那就当作是初始给出一些数,先把这些数加入序列,之后会再添加一些数。也就是全部反过来算。 可以把每次的答案分成

洛谷P3157 [CQOI2011]动态逆序对

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

P3158 [CQOI2011]放棋子(dp+组合数)

P3158 [CQOI2011]放棋子 放棋子的顺序和方案数无关,所以可以从按颜色递推 设$f[u][p][k]$为放到第$u$种颜色,所剩空间$p*k$的方案数 $g[u][i][j]$表示第$u$种颜色占据$i*j$空间的方案数,可以预处理 $g[u][i][j]=\binom{i*j}{c[u]}-\sum_{p=1}^{i}\sum_{k=1}^{j}g[u][p][k]*\binom{i}{

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

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

题解-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

[CQOI2011]动态逆序对

传送门 线段树套线段树会TLE+MLE! 树状数组不仅空间小,常数也小(我写的除外) 思考一下求逆序对需要的条件,树套树就过了 代码: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; void read(int &x) { char ch; bool ok; for(ok=