专栏文章

题解:P13109 [GCJ 2019 #1B] Manhattan Crepe Cart

P13109题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minwntsg
此快照首次捕获于
2025/12/02 09:34
3 个月前
此快照最后确认于
2025/12/02 09:34
3 个月前
查看原文
很容易想到一个做法:统计每个位置有多少人可能要去,最多人想去的就是答案。但是这样时间复杂度 O(Q2T)O(Q^2T),会炸。
发现每个人可能去的位置是一个区间,统计区间可以用差分和前缀和。分开处理每行和每列有多少人要去。然后找到最多人的行上的最多人的位置,就是答案了。

code

CPP
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int b[100010];
void pp(){
	memset(a,0,sizeof a);
	memset(b,0,sizeof b);
	int n,m;
	cin>>m>>n;
	while(m--){
		int x,y;
		cin>>x>>y;
		char c;
		cin>>c;
		if(c=='N'){
			b[y+1]++;
			b[n+1]--;
		}
		if(c=='S'){
			b[0]++;
			b[y]--;
		}
		if(c=='E'){
			a[x+1]++;
			a[n+1]--;
		}
		if(c=='W'){
			a[0]++;
			a[x]--;
		}
	}
	for(int i=1;i<=n;i++){
		a[i]+=a[i-1];
		b[i]+=b[i-1];
	}
	int mx=-1,mxx,my=-1,myy;
	for(int i=0;i<=n;i++){
		if(a[i]>mx){
			mx=a[i];
			mxx=i;
		}
	}
	for(int i=0;i<=n;i++){
		if(b[i]>my){
			my=b[i];
			myy=i;
		}
	}
	cout<<mxx<<" "<<myy<<endl;
}
int main(){
	int T;
	cin>>T;
	for(int i=1;i<=T;i++){
		cout<<"Case #"<<i<<": ";
		pp();
	}
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...