这道题和洛谷的SP4266有什么区别?玄关
  • 板块灌水区
  • 楼主MutU
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/7/11 10:07
  • 上次更新2024/7/11 11:16:23
查看原帖
这道题和洛谷的SP4266有什么区别?玄关
1160620
MutU楼主2024/7/11 10:07

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;
}
2024/7/11 10:07
加载中...