rt,我用SP4266的代码在我们学校的oj上WA了
但是别人能过
【问题描述】
日本为了迎接ACM ICPC世界总决赛的到来,计划修建许多道路。日本是一个岛国,其东海岸有N座城市,西海岸有M座城市。K条高速公路将要修建。每个海岸上的城市都被编号为1,2,…从北向南编号。每条高速公路连接东海岸的一座城市和西海岸的一座城市。修建道路的资金由ACM提供保障。有些高速公路会产生交叉。同一个地点最多只会有两条高速公路交汇于此。请你写一个程序,计算高速公路之间的交叉点的数目。
输入格式: 输入文件首先包含数字T,表示测试数据的组数。每组测试数据以三个整数N, M, K 开头,接下来K行每行两个整数,表示高速公路两头的城市编号(第一个数是东海岸的城市编号,第二个数是西海岸的城市编号)。
输出格式: 对于每组测试数据,按如下格式输出一行: Test case (测试数据编号): (交叉点数目)
输入样例#1:
1
3 4 4
1 4
2 3
3 2
3 1
输出样例#1:
Test case 1: 5
数据范围: 1<= M , N <= 1000,1<= K <= 1000,000
我的代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int K=1000100;
int n,m,k;
struct road{
int x,y;
}r[K];
int c[K];
int T,num;
bool cmp(road a,road b){
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int lowbit(int x){
return (-x) & (x);
}
void updata(int x,int d){
int i=x;
while(i<=n){
c[i]+=d;
i+=lowbit(i);
}
return;
}
int sum(int x){
int ans=0,i=x;
while(i>0){
ans+=c[i];
i-=lowbit(i);
}
return ans;
}
signed main(){
freopen("japan.txt","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>T;
while(T--){
int ans=0;
memset(c,0,sizeof(c));
cin>>n>>m>>k;
for(int i=1;i<=k;i++) cin>>r[i].x>>r[i].y;
sort(r+1,r+1+k,cmp);
for(int i=k;i>=1;i--){
ans+=sum(r[i].y-1);
updata(r[i].y,1);
}
cout<<"Test case "<<++num<<": "<<ans<<'\n';
}
return 0;
}