NC219172. 牛客推荐系统开发之动态特征获取
描述
输入描述
第一行输入三个整数、
和
,分别表示需要取动态特征的次数、这台机器能存放动态特征的个数以及所有动态特征的置信度。(
)
接下来行每行两个整数
和
,分别表示取动态特征的ID以及取动态特征时的时间戳,不保证时间戳按序给出,保证给出的时间戳是两两不相同的。(
)
输出描述
对于每一次取动态特征,输出一行字符串。如果需要进行服务间通信则输出YES,否则输出NO。
示例1
输入:
8 2 5 1 1 2 2 3 6 2 7 1 8 3 9 2 3 1 4
输出:
YES YES YES YES YES YES NO NO
说明:
示例2
输入:
5 2 100 1 1 2 2 1 3 3 4 2 5
输出:
YES YES NO YES YES
说明:
C++ 解法, 执行用时: 139ms, 内存消耗: 8428K, 提交时间: 2021-06-12 02:50:09
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll i,j,k,n,m,t,now[10050000],cur,res[200500],now2[10050000]; struct sb{ ll id,t,q; bool operator<(const sb x)const{return t<x.t;} }s[200500]; set<sb> st,nmsl; vector<sb> v; int main(){ scanf("%lld%lld%lld",&n,&m,&t); for(i=1;i<=n;i++){ scanf("%lld%lld",&s[i].id,&s[i].t); s[i].q=i; } sort(s+1,s+n+1); for(i=1;i<=n;i++){ cur=s[i].t; v.clear(); for(auto j:nmsl){ if(j.t+t>cur){break;} v.push_back(j); } for(auto j:v){ st.erase(s[now[j.id]]); nmsl.erase(j); now[j.id]=0; now2[j.id]=0; } if(now[s[i].id]){ res[s[i].q]=1; st.erase(s[now[s[i].id]]); } else{ now2[s[i].id]=i; nmsl.insert(s[i]); } st.insert(s[i]); now[s[i].id]=i; while(st.size()>m){ nmsl.erase(s[now2[(*st.begin()).id]]); now2[(*st.begin()).id]=0; now[(*st.begin()).id]=0; st.erase(st.begin()); } } for(i=1;i<=n;i++){ puts(res[i]?"NO":"YES"); } }