您的位置:首页 > 其它

POJ 3067 Japan 树状数组 .

2016-08-29 14:40 525 查看
题目地址:http://poj.org/problem?id=3067

要用long long类型保存答案,不然WA

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef pair<int,int> Edge;
typedef long long LL;
const int maxn=1000+5;
int lowbit[maxn],C[maxn];
vector<Edge> edges;
void init(int n)
{
for(int i=1;i<=n;i++)
lowbit[i]=i&(-i);
}
int Sum(int p) //a[1]+a[2]+....+a[p]
{
int sum=0;
while(p>0){
sum+=C[p];
p-=lowbit[p];
}
return sum;
}
void Modify(int p,int val,int n)
{
while(p<=n){
C[p]+=val;
p+=lowbit[p];
}
}
int main()
{
int T,kase=0;
init(maxn);
cin>>T;
while(T--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
edges.clear();
while(k--)
{
int u,v;
scanf("%d%d",&u,&v);
edges.push_back(Edge(u,v));
}
sort(edges.begin(),edges.end());
LL sum=0;
memset(C,0,sizeof(C));
for(int i=0;i<edges.size();i++)
{
int u=edges[i].first,v=edges[i].second;
sum+=i-Sum(v);
Modify(v,1,m);
}
printf("Test case %d: %lld\n",++kase,sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: