您的位置:首页 > 其它

POJ 1007

2009-11-25 20:18 197 查看
题意:逆序对

总结:我私下里WA了好几次,才发现我从前的逆序对写法是有错误的。要注意统计逆序对时加的数量

统计:2WA, 1CE

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#define FOR(i,a,b) for (int i=a;i<=b;i++)
using namespace std;

class node
{
public:
int v,o;
string s;
node()
{}

bool operator <(const node& b) const
{
if (v!=b.v)
return (v<b.v);
return (o<b.o);
}

friend ostream& operator << (ostream& os,const node& b)
{
os << b.s;
return os;
}
};

node a[101];

string str;

char c[101];

int mergesort(int l, int r)
{
int ret=0;
if (l<r)
{
int mid=(l+r)/2;
int a=mergesort(l, mid);
int b=mergesort(mid+1, r);
ret=a+b;
int i=l, j=mid+1;
int total=l;
while(i<=mid || j<=r)
{
if (j>r || (i<=mid && str[i]<=str[j]) )
c[total++]=str[i++];
else
{
c[total++]=str[j++];
ret+=mid-i+1;
}
}
FOR(i,l,r)
str[i]=c[i];
}
//cout << l << "," << r << " " << ret << " " << str<< endl;
return ret;
}

int n, len;

int main()
{
//freopen ("in.txt","r",stdin);
//freopen ("out.txt","w",stdout);

len=0;
n=0;
cin >> len >> n;
FOR(i,1,n)
{
cin >> str;
a[i].s=str;
a[i].o=i;
a[i].v=mergesort(0, len-1);
}

sort(&a[1], &a[n+1]);

FOR(i,1,n)
cout << a[i] <<  endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: