洛谷
\(cdq\)分治,按照時間來分治
應為乙個刪除不能對前面的操作貢獻,所以考慮乙個刪除操作對它後面時間的操作的貢獻
用上乙個答案減去次貢獻即可
**
#include #include #include #include #include #include #include using namespace std;
namespace io
} inline int gi()
const int max_n = 40005;
struct node t[max_n];
bool cmp_x(node a, node b)
bool cmp_y(node a, node b)
int n, m, ans, x[max_n], a[max_n], b[max_n], c[max_n], d[max_n];
inline int lb(int x)
void add(int x, int v)
int sum(int x)
void div(int l, int r)
for (int i = mid + 1; i < j; i++) add(t[i].z, -1);
j = r;
for (int i = mid; i >= l; i--)
for (int i = r; i > j; i--) add(t[i].z, -1);
inplace_merge(&t[l], &t[mid + 1], &t[r + 1], cmp_y);
} int main ()
sort(&t[1], &t[n + 1], cmp_x);
memset(c, 0, sizeof(c));
div(1, n);
for (int i = 1; i <= n; i++) c[t[i].y] = t[i].s;
printf("%d ", ans);
for (int i = 1; i <= m; i++) printf("%d ", ans -= c[d[i]]);
return 0;
}
Luogu1393 動態逆序對(CDQ分治)
對於給定的一段正整數序列,我們定義它的逆序對的個數為序列中ai aj且i j的有序對 i,j 的個數。你需要計算出乙個序列的逆序對組數及其刪去其中的某個數的逆序對組數。輸入格式 第一行,兩個數n,m,表示序列中有n個數,要刪去m個數 第二行n個數,表示給定的序列。第三行m個數,第i個數di表示要刪去...
動態逆序對
容易寫掛 對於新手與蒟蒻 洛谷 cdq 如果按照三維偏序那樣求,那麼會漏掉一些情況。所以要跑兩遍cdq。兩遍cdq又會有乙個問題,就是判等於的問題。第一遍cdq第三維判等於,第二遍判不等於.include define ll long long using namespace std inline ...
動態逆序對
題目鏈結 對於序列a,它的逆序對數定義為滿足iaj的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪 除m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數 input 輸入第一行包含兩個整數n和m,即初始元素的個數和刪除的元素個數。以下n行每行包含乙個1到n之間的正整數,即...