蓝桥杯省赛-2018-C/C++-B-9

two pointers

#include<bits/stdc++.h>
using namespace std;
#define LOCAL
#define ll long long int
#define inf 0x3f3f3f3f
#define mset(a,b) memset(a,b,sizeof(a))
const int maxn=1e5+5;
set<int> s;
vector<int> ts[maxn];
int n,k,d;
bool twoPointers(int x){
    int s=0,t=0,sum=0;
    int n=ts[x].size();
    sort(ts[x].begin(),ts[x].end());
    for(;;){
        while(t<n&&sum<k){
            sum++;
            t++;
        }
        if(sum<k) return false;
        if(ts[x][t-1]-ts[x][s]<d) 
            return true;
        else {
            s++;
            sum--;
        }
    }
}
void solve(){
    cin>>n>>d>>k;
	for(int i=0;i<n;i++)
	{
		int tt,id;
		cin>>tt>>id;
		ts[id].push_back(tt);
		s.insert(id);
	}
    int sz=s.size();
    for(int i=0;i<sz;i++){
        set<int>::iterator it=s.begin();
        int x=*it;
        if(twoPointers(x)){
            cout<<x<<"\n";
        }
        s.erase(it);
    }
}
int main(){
#ifdef LOCAL
    freopen("in.in","r",stdin);
#endif
    solve();
    return 0;
}
Author: universal42
Link: https://universal4s.github.io/2019/03/18/lqb-2018-C-B-9/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.