更简洁版
因对pair排序,就是先按照第一个关键字从小到达排序,然后按照第二个从小到大排序。
#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;
}
复杂冗余版
错误在于:判断日志的赞的答案的代码的顺序应该放在for循环的下面,否则会遗漏答案
#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;
}