双指针--日志统计

如果不排顺序的话,那么还得遍历n方,所以复杂度通过sort减少很多。所以这也是双指针排序思想的理解。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
bool sure[N];

  struct Date{
      int t;
      int id;
  };

bool cmp(Date a, Date b){              //使双指针按重要顺序排列,以便下文的 j-i能表示在规定时间内的赞

     if(a.id==b.id) return a.t<b.t;
     return a.id<b.id;
}

int main()
{
  
  int n,d,k;
  int t,id;
  int count=0;
  cin>>n>>d>>k;

  Date a[N];
  for(int i=0;i<n;i++){
         cin>>t>>id;
         a[i]={t,id};
  }

  sort(a,a+n,cmp);

  for(int i=0,j=0;i<n;){

          while(j<n&&a[j].id==a[i].id&&a[j].t-a[i].t<d){
                 j++;
          }
          if(j-i>=k){

                //cout<<a[i].id<<"\n";             //注意的是如果这里是cout<<a[j].id<<"\n";  那么答案是错的
                 sure[a[i].id]=true;             //这是另一种输出方法,不过不是AC,只有85%;
          }

          if(a[i].id!=a[j].id){

               i=j;
          }

          else i++;
  }

  for(int i=0;i<N;i++){
    if(sure[i])
    cout<<i<<"\n";
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值