题目链接:
http://poj.org/problem?id=3067
题意:
日本有N个城市在东边,从北至南编号为1 2 3,,,N,M个城市在西边,从北至南编号为1 2 ,,,,M,K条高速公路将被建造
高速公路的一端在西边,一端在东边
输入有多组样例,
每组样例第一行为
n m k
接下来有k行,分别为高速公路的端点
求高速公路的交点有多少个,不包括以城市为相交点
题解:
对Ax,Ay和Bx,By两条高速公路,有相交点必须(Ax-Bx)*(Ay-By)<0
所以就按照左边从大到小排序,找右边的逆序数。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//////////////////////////////////////////////////////////////////////////
const int maxn = 1e6+10;
ll bit[maxn];
struct node{
int s,e;
bool operator<(const node& rhs) const{
if(s == rhs.s) return e < rhs.e;
return s < rhs.s;
}
}a[maxn];
void add(int x,int v){
while(x<maxn){
bit[x] += v;
x += x&-x;
}
}
ll sum(int x){
ll res = 0;
while(x > 0){
res += bit[x];
x -= x&-x;
}
return res;
}
int main(){
int T = read();
for(int cas=1; cas<=T; cas++){
MS(bit);
int n,m,k; cin>>n>>m>>k;
for(int i=0; i<k; i++){
a[i].s=read(),a[i].e=read();
}
sort(a,a+k);
ll ans = 0;
for(ll i=0; i<k; i++){
ans += i-sum(a[i].e);
add(a[i].e,1);
}
cout << "Test case " << cas << ": " << ans << endl;
}
return 0;
}