POJ 1007
2013-07-10 23:46
302 查看
求逆序数,数据很小可以暴力。但是用来练练线段树还不错,还有离散化。
线段树求逆序数:
从前往后插入数据,找比它大的数。或者从后往前插入数据,找比它小的数据。
离散化可以用如下代码:
也可以用STL代码:
线段树求逆序数:
从前往后插入数据,找比它大的数。或者从后往前插入数据,找比它小的数据。
离散化可以用如下代码:
bool cmp(int i,int j) { return now[i] < now[j]; } int calrank1() { for(int i = 0 ; i < strlen(now); i++) myrank[i] = i; sort(myrank, myrank + strlen(now), cmp); int r = 1; hash[myrank[0]] = 1; for(int i = 1 ; i < strlen(now); i++) { if(now[myrank[i]] != now[myrank[i-1]]) { r ++; } hash[myrank[i]] = r; } return r; }
也可以用STL代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX = 55; #define lson l, m, rt<<1 #define rson m+1,r,rt<<1|1 int sum[MAX<<2]; int m,n; char str[101][51]; char now[51]; int mycount[101]; int myrank[101]; //排第几的是谁 int hash[101]; //它排第几 void insert(int p,int l,int r,int rt) { if(l == r) { sum[rt]++; return; } int m = (l+r)>>1; if(p <= m) insert(p, lson); else insert(p, rson); sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } int query(int L,int R,int l,int r,int rt) { if(L <= l && r <= R) { return sum[rt]; } int m = (l+r)>>1; int ans = 0 ; if(L <= m) ans += query(L, R, lson); if(m < R) ans += query(L, R, rson); return ans; } int calrank() { for(int i = 0 ; i < strlen(now); i++) { myrank[i] = now[i]; } sort(myrank, myrank+strlen(now)); int size=unique(myrank, myrank+n)- myrank; for(int i = 0 ; i < strlen(now); i++) { hash[i]=lower_bound(myrank ,myrank+size,now[i]) - myrank + 1; } return size; } int main() { while(scanf("%d%d", &n, &m)!=EOF) { for(int i = 0 ; i < m; i++) { scanf("%s", str[i]); strcpy(now, str[i]); int rn = calrank(); memset(sum, 0, sizeof(sum)); mycount[i] = 0; for(int j = strlen(now)-1; j >= 0; j--) { insert(hash[j], 1, rn, 1); if(hash[j] >= 2) mycount[i] += query(1, hash[j]-1, 1, rn, 1); } } for(int i = 0 ; i < m; i++) { int minindex = -1; int mincount = 100000; for(int j = 0; j < m; j++) { if(mycount[j] < mincount) { mincount = mycount[j]; minindex = j; } } printf("%s\n", str[minindex]); mycount[minindex] = 100000; } } }
相关文章推荐
- poj 1007 DNA Sorting
- POJ 1007 (未解决)
- POJ 1007 解题报告 DNA Sorting
- POJ 1007 DNA Sorting
- poj 1007 DNA Sorting
- 【POJ】1007 DNA Sorting
- poj 1007 DNA Sorting(排序--快排)
- POJ 1007 && HDU 1379 DNA Sorting(水~)
- http://poj.org/problem?id=1007
- POJ 1007 DNA Sorting GCC编译
- POJ 1007
- POJ 1007 DNA Sorting
- poj_1007
- POJ 1007 DNA Sorting(sort函数的使用)
- POJ 1007 DNA Sorting【求逆序数】
- poj-1007
- 请教!!!POJ: 1007一直wrong answer,换一种写法就AC,其实是一样的。。
- poj 1007 DNA Sorting
- poj 1007 DNA sorting
- poj 1007 DNAsorting