URAL - 1090 D - Inverse Order Pair——线段树求逆序数
2017-11-07 12:34
316 查看
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1e5 + 10; int n, k, a[maxn], ans[maxn], res; struct Tree { int data[maxn<<1]; void init() { memset(data, 0, sizeof(data)); } void pushup(int root) { data[root] = data[root<<1] + data[root<<1|1]; } void updata(int l, int r, int root, int pos) { if (l == r) { data[root] += 1; return; } int mid = (l + r)>>1; if (pos <= mid) updata(l, mid, root<<1, pos); else updata(mid + 1, r, root<<1|1, pos); pushup(root); } int query(int l, int r, int root, int ql, int qr) { if (ql <= l && r <= qr) { return data[root]; } int mid = (l + r)>>1; int ans = 0; if (ql <= mid) ans += query(l, mid, root<<1, ql, qr); if (mid < qr) ans += query(mid + 1, r, root<<1|1, ql, qr); return ans; } }tree; int main() { while (~scanf("%d %d", &n, &k)) { res = 0; for (int i = 1; i <= k; i++) { for (int j = 1; j <= n; j++) scanf("%d", &a[j]); tree.init(); int sum = 0; for (int j = n; j >= 1; j--) { sum += tree.query(1, n, 1, 1, a[j]); tree.updata(1, n, 1, a[j]); } ans[i] = sum; res = max(res, sum); } for (int i = 1; i <= k; i++) { if (ans[i] == res) { printf("%d\n", i); break; } } } return 0; }
相关文章推荐
- Ural1090 (树状数组求逆序数)
- <Sicily>Inversion Number(线段树求逆序数)
- Ural 1028. Stars 线段树单点更新
- URAL - 1019 - Line Painting(离散化+线段树)
- HDU2689 Sort it 逆序数-线段树单点更新
- Minimum Inversion Number(线段树求逆序数)
- 1090. In the Army Now (Ural 1090 归并排序||树状数组)
- ural 2019 Pair: normal and paranormal
- URAL 1989 Subpalindromes(回文串 线段树 多项式hash)
- 利用线段树求逆序数(JAVA)
- ural 1019 Line Painting 线段树 区间染色
- hdu 1394 最小逆序数 线段树单点增减,区间求和
- URAL 2014 Zhenya moves from parents 线段树
- ural 1846. GCD 2010(线段树)
- URAL 2014 Zhenya moves from parents --线段树
- 【Ural1028】Stars-线段树和树状数组入门题
- URAL 1846 线段树 最大公约数
- Minimum Inversion Number(线段树单点更新+逆序数)
- 线段树或树状数组求逆序数
- HDU 1394 Minimum Inversion Number (线段树求逆序数 )