hdu 5497 Inversion 线段树
2015-10-04 09:19
218 查看
昨天比赛差一点点就能过了T^T 啥也不说了,我就是个傻逼 T^T
另外几道改天再发= =
把序列分成三部分 a b c b为去掉的部分,最小逆序数就是 整个的逆序数 - a中数>b中数 的对数 - b中逆序数 - b中数>c中数的对数,维护时每次去掉一个再加上一个,开线段树就可以了
另外几道改天再发= =
把序列分成三部分 a b c b为去掉的部分,最小逆序数就是 整个的逆序数 - a中数>b中数 的对数 - b中逆序数 - b中数>c中数的对数,维护时每次去掉一个再加上一个,开线段树就可以了
#pragma warning(disable:4996) #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<vector> using namespace std; typedef long long LL; #define lson l,mid,x<<1 #define rson mid+1,r,x<<1|1 #define root 0,n+1,1 const int maxn = 100005; typedef struct SegTree{ int t[maxn*4]; void clear(int l,int r,int x) { t[x] = 0; if (l == r) return; int mid = (l + r) / 2; clear(lson); clear(rson); } void update(int p, int add, int l, int r, int x) { if (l == r&&l == p) { t[x] += add; return; } int mid = (l + r) / 2; if (p <= mid) update(p, add, lson); else update(p, add, rson); t[x] = t[x << 1] + t[x << 1 | 1]; } int get(int L, int R, int l, int r, int x) { if (L == l&&R == r) return t[x]; int mid = (l + r) / 2; if (R <= mid) return get(L, R, lson); if (L > mid) return get(L, R, rson); return get(L, mid, lson) + get(mid + 1, R, rson); } }SegTree; SegTree A, C, T; int n, m, a[maxn]; int main() { int t; cin >> t; LL ret, tmp; while (t--) { ret = tmp = 0; cin >> n>> m; A.clear(root);C.clear(root);T.clear(root); for (int i = 1;i <= n;i++) { scanf("%d", &a[i]); ret += T.get(a[i] + 1, n + 1, root);//求比现在这个数大的 T.update(a[i], 1, root);//加入这个数 } T.clear(root); for (int i = 1;i <= m;i++) { tmp += T.get(a[i] + 1, n + 1, root);//求B内部逆序 T.update(a[i], 1, root); } for (int i = m + 1;i <= n;i++) { C.update(a[i], 1, root);//求B大于C部分 tmp += T.get(a[i] + 1, n + 1, root); } LL Max = tmp; for (int i = 1;i <= n - m;i++) { int mm = a[i], tt = a[i + m]; tmp -= A.get(mm + 1, n + 1, root);//a中大于m的 tmp -= C.get(0, mm - 1, root); A.update(mm, 1, root); tmp += A.get(tt + 1, n + 1, root); tmp += C.get(0, tt - 1, root); Max = max(tmp, Max); C.update(tt, -1, root); } printf("%lld\n", ret - Max); } return 0; }
相关文章推荐
- storm rebalance 命令调整topology并行数及问题分析
- sql行转列
- solr Error initializing QueryElevationComponent.
- 安卓页面跳转使用Context.startActivity注意事项
- scp:command not found
- VMware ESXi下虚拟机的嗅探设置
- DirectX11 混合方程
- 关于精灵帧(Sprite Frame)的尺寸大小
- 关于精灵帧(Sprite Frame)的尺寸大小
- 关于精灵帧(Sprite Frame)的尺寸大小
- org/apache/flume/tools/GetJavaProperty
- namenode无法启动,不报错
- loadrunner没有 demo_scenario.lrs
- loadrunner录入脚本有乱码解决方法
- HDU 1711 Number Sequence(kmp)
- HDU 2103 Family planning(水~)
- HDU 2107 Founding of HDU(水~)
- Java中的static关键字解析
- POJ 2446 Chessboard
- loadrunner11安装出现Microsoft Visual c++2005 sp1安装失败