hdu 1394 Minimum Inversion Number
来源:互联网 发布:unix 安装 软件 编辑:程序博客网 时间:2024/06/06 01:19
线段树入门第三题。
这题想了会发现没思路,找队友讨论了下,发现是如此的水,但就因为在query里把left与right写反了,又调试了半天(承认自己很挫)。最终还是1A了,这题确实很好,不愧是hh大神推荐的,做完都感觉爽。
题意:给你一个0~n-1的序列,输入的顺序是无序的,可以移动前任意个到最后面去,问你逆序对(对应的位置与大小相反)最少的数目。
思路:0~n-1不方便,直接在每个上+1,变成1~n的,先建个1~n的线段树,用sum存这个区间数目的个数(初始化为0),在每次输入的时候都将这个数插入,然后查询这个线段树里比现在这个数大的数,就是存在的逆序对。 对于将前n个数移到最后的操作也很简单,你就一个一个移,每次移的时候只与最前面的那个数有关(序列是1~n的不重复的),相信提醒到这里你会有灵感的。
#include<cstdio>#include<cstring>#include<iostream>#define L(u) (u<<1)#define R(u) (u<<1|1)using namespace std;const int N = 5001;int arr[N];struct Node{int l,r,sum;}node[N<<2];int min(int a,int b){ return a>b?b:a;}void build(int u,int left,int right){ node[u].l = left; node[u].r = right; node[u].sum = 0; if(node[u].l==node[u].r) { return; } int mid = (node[u].l+node[u].r)>>1; build(L(u),left,mid); build(R(u),mid+1,right);}void upDate(int u,int val){ if(node[u].l==node[u].r&&val==node[u].l) { node[u].sum = 1; return; } if(val>node[u].r||val<node[u].l) return; int mid = (node[u].l+node[u].r)>>1; if(val<=mid) { upDate(L(u),val); } else { upDate(R(u),val); } node[u].sum = node[L(u)].sum + node[R(u)].sum;}int query(int u,int left,int right){ if(left>right) return 0; if(left<=node[u].l&&node[u].r<=right) return node[u].sum; int mid = (node[u].l+node[u].r)>>1; if(right<=mid) { return query(L(u),left,right); } else if(left>mid) { return query(R(u),left,right); } else { return query(L(u),left,mid)+query(R(u),mid+1,right); }}int main(void){ int n; while(scanf("%d",&n)!=EOF) { int sum = 0; build(1,1,n); for(int i=1;i<=n;++i) { scanf("%d",arr+i); ++arr[i]; upDate(1,arr[i]); sum += query(1,arr[i]+1,n); } int ans = sum; for(int i=1;i<n;++i) { sum = sum - (arr[i]-1) + n - arr[i]; ans = min(sum,ans); } printf("%d\n",ans); } return 0;}
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- HDU-1394-Minimum Inversion Number
- HDU 1394 - Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- Hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- Hdu 1394 Minimum Inversion Number
- Minimum Inversion Number HDU 1394
- HDU 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- Minimum Inversion Number----hdu 1394
- OpenId学习及DotNetOpenAuth初探
- Oracle ORA-01940 无法删除当前已连接用户
- uva 579
- Android开源项目之Music (一)--- MusicBrowserActivity
- php网站访问量
- hdu 1394 Minimum Inversion Number
- Android 测试工具Monkey & Monkeyrunner 使用方法
- start over
- hdu 1160 FatMouse's Speed (最长单调递减子序列+纪录路径)
- Linux中图形模式与文本模式切换
- strcpy,strncpy,memcpy的源码分析
- edittext光标一直固定在文字后显示
- [leetcode刷题系列]Add Binary
- intel dpdk api makefile 编译选项修改 和 gdb 调试