0
点赞
收藏
分享

微信扫一扫

【蓝桥杯】1238. 日志统计*(双指针)

橙子好吃吗 2022-04-03 阅读 36

穿越隧道

更简洁版

#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N = 1e6 + 10;
int n,d,k;
int kk;
pii a[N]; 
int path[N];
int mp[N];
bool st[N];
int main(){
	scanf("%d%d%d",&n,&d,&k);
	for(int i = 0; i < n; i++){
		scanf("%d%d",&a[i].x,&a[i].y);
	}
	sort(a,a + n);
	for(int i = 0,j = 0; i < n; i++){
		mp[a[i].y]++;
		while(a[i].x - a[j].x >= d){
			mp[a[j].y]--;
			j++;
		}
		if(mp[a[i].y] >= k){
			st[a[i].y] = true;
		}
	}
	for(int i = 0; i < N; i++){
		if(st[i])
			cout << i << endl;
	}
	return 0;
}

简洁版

#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N = 1e6 + 10;
int n,d,k;
int kk;
pii a[N]; 
int path[N];
int mp[N];
bool st[N];
bool cmp(pii a, pii b){
	if(a.x == b.x){
		return a.y < b.y;
	}
	return a.x < b.x;
}
int main(){
	scanf("%d%d%d",&n,&d,&k);
	for(int i = 0; i < n; i++){
		scanf("%d%d",&a[i].x,&a[i].y);
	}
	sort(a,a + n,cmp);
	for(int i = 0,j = 0; i < n; i++){
		mp[a[i].y]++;
		while(a[i].x - a[j].x >= d){
			mp[a[j].y]--;
			j++;
		}
		if(mp[a[i].y] >= k){
			st[a[i].y] = true;
		}
	}
	for(int i = 0; i < N; i++){
		if(st[i])
			cout << i << endl;
	}
	return 0;
}

复杂冗余版

#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N = 1e6 + 10;
int n,d,k;
int kk;
pii a[N]; 
int path[N];
int mp[N];
bool st[N];
bool cmp(pii a, pii b){
	if(a.x == b.x){
		return a.y < b.y;
	}
	return a.x < b.x;
}
int main(){
	scanf("%d%d%d",&n,&d,&k);
	for(int i = 0; i < n; i++){
		scanf("%d%d",&a[i].x,&a[i].y);
	}
	sort(a,a + n,cmp);
	for(int i = 0,j = 0; i < n; i++){
		mp[a[i].y]++;
		while(a[i].x - a[j].x >= d){
			mp[a[j].y]--;
			j++;
		}
		//顺序问题很重要,if代码段要放在下面,因当时间段大于等于d时,其中可能存在符合的答案
		if(a[i].x - a[j].x < d){
			if(mp[a[i].y] >= k && !st[a[i].y]){
				path[kk++] = a[i].y;
				st[a[i].y] = true;
			}
		}
	}
	sort(path,path+kk);
	for(int i = 0; i < kk; i++){
		cout << path[i] << endl;
	}
	
	return 0;
}
举报

相关推荐

0 条评论