数据结构1-3 灯塔
2015-07-29 10:48
274 查看
我自己用的merge排序,只有50通过。待我优化一下。
#include <iostream>
using namespace std;
#define maxLength 4000000
typedef long long Rank;
class Node{
public:
int x;
int y;
};
class NodeList{
public:
Node* _elem;
int _size;
void copyFrom(Node* A , int lo, int hi);
NodeList(Node *A, int n){copyFrom(A, 0, n);}
NodeList(){_size = 0;_elem = new Node[3];}
Rank invertion(int lo, int mi, int hi);
Rank invertionCount(int lo, int hi );
};
void NodeList::copyFrom(Node * A,int lo, int hi)
{
_size = 0;
_elem = new Node[2 * (hi - lo)];
while(lo < hi)
_elem[_size++] = A[lo++];
}
Rank NodeList::invertion(int lo, int mi, int hi){
Rank CountNum = 0;
Node *A = _elem+ lo;
int leftNum = mi - lo;
Node *B = new Node[leftNum];
for (int i = 0 ; i < leftNum ;B[i] = A[i++]);
int rightNum = hi - mi;
Node *C = _elem + mi;
for (int i = 0, j = 0, k = 0; (k < rightNum) || (j < leftNum);)
{
if ((j < leftNum) && (! (k < rightNum) || B[j].x <= C[k].x) )
{
for (int tmp = k; tmp < rightNum; tmp++)
{
if (B[j].y < C[tmp].y)
{
CountNum++;
}
}
A[i++] = B[j++];
};
if ( ( k < rightNum ) && (! (j < leftNum) || C[k].x < B[j].x))
{
for (int tmp = j; tmp < leftNum; tmp++)
{
if (C[k].y < B[tmp].y)
{
CountNum++;
}
}
A[i++] = C[k++];
}
}
delete []B;
return CountNum;
}
Rank NodeList::invertionCount(int lo, int hi ){
if (hi - lo < 2)
return 0;
int mi = (lo + hi) >> 1;
Rank a =invertionCount(lo ,mi);
Rank b =invertionCount(mi, hi);
Rank c =invertion(lo ,mi, hi);
return a + b + c;
}
int main(){
Node *A = new Node[maxLength];
int n;
cin >> n;
for (int i = 0;i < n ;i++)
{
Node tmp;
cin >> tmp.x >> tmp.y;
A[i] = tmp;
}
NodeList *listA = new NodeList(A,n);
cout << listA->invertionCount(0,n);
}
//参考网上的思路,先用快排对x坐标进行排序,之后仅对y进行处理,计算逆序对数,之后用(n) * (n -1)/2 - 逆序对数 就是正序对数。过了95%
#include <stdio.h>
#include <stdlib.h>
#define maxLength 4000000
typedef long long Rank;
class Node{
public:
int x;
int y;
};
class NodeList{
public:
int* _elem;
int _size;
void copyFrom(Node* A , int lo, int hi);
NodeList(Node *A, int n){copyFrom(A, 0, n);}
NodeList(){_size = 0;_elem = new int[3];}
Rank invertion(int lo, int mi, int hi);
Rank invertionCount(int lo, int hi );
};
void NodeList::copyFrom(Node * A,int lo, int hi)
{
_size = 0;
_elem = new int[2 * (hi - lo)];
while(lo < hi)
_elem[_size++] = A[lo++].y;
}
Rank NodeList::invertion(int lo, int mi, int hi){
Rank CountNum = 0;
int *A = _elem+ lo;
int leftNum = mi - lo;
int *B = new int[leftNum];
for (int i = 0 ; i < leftNum ;B[i] = A[i++]);
int rightNum = hi - mi;
int *C = _elem + mi;
for (int i = 0, j = 0, k = 0; (k < rightNum) || (j < leftNum);)
{
if ((j < leftNum) && (! (k < rightNum) || B[j] <= C[k]) )
{
A[i++] = B[j++];
};
if ( ( k < rightNum ) && (! (j < leftNum) || C[k] < B[j]))
{
A[i++] = C[k++];
CountNum += leftNum - j;
}
}
delete []B;
return CountNum;
}
Rank NodeList::invertionCount(int lo, int hi ){
if (hi - lo < 2)
return 0;
int mi = (lo + hi) >> 1;
Rank a =invertionCount(lo ,mi);
Rank b =invertionCount(mi, hi);
Rank c =invertion(lo ,mi, hi);
return a + b + c;
}
int cmp(const void *a,const void *b)
{
return (*(Node*)a).x > (*(Node*)b).x ? 1 : -1;
}
int main(){
Node *A = new Node[maxLength];
int n;
scanf("%d", &n);
for (int i = 0;i < n ;i++)
{
Node tmp;
scanf("%d%d",&tmp.x,&tmp.y);
A[i] = tmp;
}
qsort(A,n,sizeof(A[0]),cmp);
NodeList *listA = new NodeList(A,n);
Rank tmp = Rank(n) * Rank(n - 1)/2;
printf("%lld",tmp - listA->invertionCount(0,n) );
}
fread我真的是不太会了.....
#include <iostream>
using namespace std;
#define maxLength 4000000
typedef long long Rank;
class Node{
public:
int x;
int y;
};
class NodeList{
public:
Node* _elem;
int _size;
void copyFrom(Node* A , int lo, int hi);
NodeList(Node *A, int n){copyFrom(A, 0, n);}
NodeList(){_size = 0;_elem = new Node[3];}
Rank invertion(int lo, int mi, int hi);
Rank invertionCount(int lo, int hi );
};
void NodeList::copyFrom(Node * A,int lo, int hi)
{
_size = 0;
_elem = new Node[2 * (hi - lo)];
while(lo < hi)
_elem[_size++] = A[lo++];
}
Rank NodeList::invertion(int lo, int mi, int hi){
Rank CountNum = 0;
Node *A = _elem+ lo;
int leftNum = mi - lo;
Node *B = new Node[leftNum];
for (int i = 0 ; i < leftNum ;B[i] = A[i++]);
int rightNum = hi - mi;
Node *C = _elem + mi;
for (int i = 0, j = 0, k = 0; (k < rightNum) || (j < leftNum);)
{
if ((j < leftNum) && (! (k < rightNum) || B[j].x <= C[k].x) )
{
for (int tmp = k; tmp < rightNum; tmp++)
{
if (B[j].y < C[tmp].y)
{
CountNum++;
}
}
A[i++] = B[j++];
};
if ( ( k < rightNum ) && (! (j < leftNum) || C[k].x < B[j].x))
{
for (int tmp = j; tmp < leftNum; tmp++)
{
if (C[k].y < B[tmp].y)
{
CountNum++;
}
}
A[i++] = C[k++];
}
}
delete []B;
return CountNum;
}
Rank NodeList::invertionCount(int lo, int hi ){
if (hi - lo < 2)
return 0;
int mi = (lo + hi) >> 1;
Rank a =invertionCount(lo ,mi);
Rank b =invertionCount(mi, hi);
Rank c =invertion(lo ,mi, hi);
return a + b + c;
}
int main(){
Node *A = new Node[maxLength];
int n;
cin >> n;
for (int i = 0;i < n ;i++)
{
Node tmp;
cin >> tmp.x >> tmp.y;
A[i] = tmp;
}
NodeList *listA = new NodeList(A,n);
cout << listA->invertionCount(0,n);
}
//参考网上的思路,先用快排对x坐标进行排序,之后仅对y进行处理,计算逆序对数,之后用(n) * (n -1)/2 - 逆序对数 就是正序对数。过了95%
#include <stdio.h>
#include <stdlib.h>
#define maxLength 4000000
typedef long long Rank;
class Node{
public:
int x;
int y;
};
class NodeList{
public:
int* _elem;
int _size;
void copyFrom(Node* A , int lo, int hi);
NodeList(Node *A, int n){copyFrom(A, 0, n);}
NodeList(){_size = 0;_elem = new int[3];}
Rank invertion(int lo, int mi, int hi);
Rank invertionCount(int lo, int hi );
};
void NodeList::copyFrom(Node * A,int lo, int hi)
{
_size = 0;
_elem = new int[2 * (hi - lo)];
while(lo < hi)
_elem[_size++] = A[lo++].y;
}
Rank NodeList::invertion(int lo, int mi, int hi){
Rank CountNum = 0;
int *A = _elem+ lo;
int leftNum = mi - lo;
int *B = new int[leftNum];
for (int i = 0 ; i < leftNum ;B[i] = A[i++]);
int rightNum = hi - mi;
int *C = _elem + mi;
for (int i = 0, j = 0, k = 0; (k < rightNum) || (j < leftNum);)
{
if ((j < leftNum) && (! (k < rightNum) || B[j] <= C[k]) )
{
A[i++] = B[j++];
};
if ( ( k < rightNum ) && (! (j < leftNum) || C[k] < B[j]))
{
A[i++] = C[k++];
CountNum += leftNum - j;
}
}
delete []B;
return CountNum;
}
Rank NodeList::invertionCount(int lo, int hi ){
if (hi - lo < 2)
return 0;
int mi = (lo + hi) >> 1;
Rank a =invertionCount(lo ,mi);
Rank b =invertionCount(mi, hi);
Rank c =invertion(lo ,mi, hi);
return a + b + c;
}
int cmp(const void *a,const void *b)
{
return (*(Node*)a).x > (*(Node*)b).x ? 1 : -1;
}
int main(){
Node *A = new Node[maxLength];
int n;
scanf("%d", &n);
for (int i = 0;i < n ;i++)
{
Node tmp;
scanf("%d%d",&tmp.x,&tmp.y);
A[i] = tmp;
}
qsort(A,n,sizeof(A[0]),cmp);
NodeList *listA = new NodeList(A,n);
Rank tmp = Rank(n) * Rank(n - 1)/2;
printf("%lld",tmp - listA->invertionCount(0,n) );
}
fread我真的是不太会了.....
相关文章推荐
- java 数据结构之 链式存储结构 队列
- java 数据结构之 顺序存储结构 队列
- 图结构练习——最小生成树
- cocos2d-x3.0数据结构
- 数据结构
- 数据结构基础温故-5.图(中):最小生成树算法
- 数据结构和算法学习笔记-2
- 数据结构之双向链表(JAVA实现)
- 数据结构---二叉树(1)
- 数据结构实验之队列一:排队买饭 SDUT
- HDU 5316 Magician(线段树区间合并入门)
- 黑马程序员——高新技术---Java基础-集合特点和数据结构总结
- 数据结构实验之二叉树的建立与遍历 SDUT
- 数据结构实验:连通分量个数
- HDU 1277 - 全文检索
- 进程01
- 数据结构和算法学习笔记-1
- 数据结构与算法学习目录
- java数据结构
- 数据结构实验之栈二:一般算术表达式转换成后缀式 SDUT