您的位置:首页 > 其它

poj 3067 japan 树状数组

2012-03-22 11:03 393 查看
Poj3067 japan 这里求的是高架桥交叉的个数,首先按照规则排序,然后同上处理

这里要注意的是 输入输出要用scanf 且要用sum要用__int64
#include<iostream>

#include<algorithm>

#include<cstring>

#define maxn 2005

#define MAX 1000010

using namespace std;

struct node

{

int east,west;

};

int tree[maxn/2];

node input[MAX];

int cmp(node x1,node x2)

{

if(x1.east!=x2.east)

return x1.east<x2.east;

else

return x1.west<x2.west;

}

void update(int x,int val)

{

while(x<=1001)

{

tree[x]+=val;

x+=(x&(-x));

};

}

long long getsum(int x)

{

long long sum=0;

while(x>0)

{

sum+=tree[x];

x-=(x&-x);

}

return sum;

}

int main()

{

int nCase;

int N,M,K;

int T=1;

cin>>nCase;

while(nCase--)

{

//cin>>N>>M>>K;

scanf("%d%d%d",&N,&M,&K);

memset(tree,0,sizeof(tree));

for(int i=1;i<=K;i++)

//cin>>input[i].east>>input[i].west;

scanf("%d%d",&input[i].east,&input[i].west);

sort(input+1,input+K+1,cmp);

long long sum=0;

for(int i=1;i<=K;i++)

{

update(input[i].west,1);

sum+=i-getsum(input[i].west);

}

//cout<<"Test case "<<T<<": "<<sum<<endl;

printf("Test case %d: %I64d\n",T,sum); //这里居然必须要用__int64这种,也就是说必须要用这种格式输出,太bt了

T++;

}

system("pause");

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