At数据强度<CF数据强度!
  • 板块学术版
  • 楼主xu_zhihao
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/21 21:53
  • 上次更新2024/12/22 10:18:21
查看原帖
At数据强度<CF数据强度!
1063855
xu_zhihao楼主2024/12/21 21:53

D题感觉是random数据

暴力写法 1500ms

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x;
	int y;
};
bool cmp1(node a,node b){
	return a.x<b.x;
}
bool cmp2(node a,node b){
	return a.x>b.x;
}
bool cmp3(node a,node b){
	return a.y<b.y;
}
bool cmp4(node a,node b){
	return a.y>b.y;
}
unordered_map<long long,vector<long long>>mp1;
unordered_map<long long,vector<long long>>mp2;
unordered_map<long long,map<long long,int>>f;
unordered_map<long long,map<long long,int>>mp;
node a[200010];
int main(){
	int n,m;
	cin>>n>>m;
	int sx,sy;
	cin>>sx>>sy;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y;
		f[a[i].x][a[i].y]=1;
	}
	sort(a+1,a+n+1,cmp1);
	for(int i=1;i<=n;i++){
		mp1[a[i].y].push_back(a[i].x);
	}
	sort(a+1,a+n+1,cmp3);
	for(int i=1;i<=n;i++){
		mp2[a[i].x].push_back(a[i].y); 
	}
	long long X=sx;
	long long Y=sy; 
	int cnt=0;
	while(m--){
		string p;
		cin>>p;
		long long c;
		cin>>c;
		if(p=="U"){
			int l=lower_bound(mp2[X].begin(),mp2[X].end(),Y)-mp2[X].begin();
			int r=upper_bound(mp2[X].begin(),mp2[X].end(),Y+c)-mp2[X].begin();
			for(int i=l;i<=r-1;i++){
				//cout<<X<<" "<<mp2[X][i]<<endl;
				if(!mp[X][mp2[X][i]]){
					mp[X][mp2[X][i]]=1;
					cnt++;
				}
			}
			Y+=c;
		}
		else if(p=="D"){
			int l=lower_bound(mp2[X].begin(),mp2[X].end(),Y-c)-mp2[X].begin();
			int r=upper_bound(mp2[X].begin(),mp2[X].end(),Y)-mp2[X].begin();
			//cout<<l<<" "<<r<<endl;
			for(int i=l;i<=r-1;i++){
				if(!mp[X][mp2[X][i]]){
					mp[X][mp2[X][i]]=1;
					cnt++;
				}
			}
			Y-=c;
		}
		else if(p=="L"){
			int l=lower_bound(mp1[Y].begin(),mp1[Y].end(),X-c)-mp1[Y].begin();
			int r=upper_bound(mp1[Y].begin(),mp1[Y].end(),X)-mp1[Y].begin();
			for(int i=l;i<=r-1;i++){
				//cout<<mp1[Y][i]<<" "<<Y<<endl;
				if(!mp[mp1[Y][i]][Y]){
					mp[mp1[Y][i]][Y]=1;
					cnt++;
				}
			}
			X-=c;
		}
		else if(p=="R"){
			int l=lower_bound(mp1[Y].begin(),mp1[Y].end(),X)-mp1[Y].begin();
			int r=upper_bound(mp1[Y].begin(),mp1[Y].end(),X+c)-mp1[Y].begin();
			for(int i=l;i<=r-1;i++){
				//cout<<mp1[Y][i]<<" "<<Y<<endl;
				if(!mp[mp1[Y][i]][Y]){
					mp[mp1[Y][i]][Y]=1;
					cnt++;
				}
			}
			X+=c;
		}
	}
	cout<<X<<" "<<Y<<" "<<cnt<<endl;
  return 0;
}
2024/12/21 21:53
加载中...