Codeforces Global Round 11 C. The Hard Work of Paparazzi

pubgoso發表於2020-10-12

題目連結
思路:讀完題看到r的範圍就能發現一個小trick。時間相距超過2r的兩個明星必然有一種方式可以同時拍到。由於時間嚴格遞增,那麼暴力轉移dp最多隻有2r個初態,直接暴力即可。時間超過2r的可以搞一個雙指標記一下字首max即可。
注意一下dp陣列的初始值。
細節見程式碼。

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
#define fi first
#define se second
#define pb push_back
#define wzh(x) cerr<<#x<<'='<<x<<endl;
int r,n;
struct uzi{
  int x,y,t;
  bool operator < (const uzi & T)const{
    return t<T.t;
  }
}p[N];
int dp[N];
int main() {
  ios::sync_with_stdio(false);
  cin>>r>>n;
  p[1]={1,1,0};
  for(int i=1;i<=n;i++)cin>>p[i+1].t>>p[i+1].x>>p[i+1].y,dp[i+1]=-1e8;
  n++;
  dp[1]=0;
  for(int i=2,j=0,cur=0;i<=n;i++){
    while(j+1<i&&p[i].t-p[j+1].t>=2*r){
      cur=max(cur,dp[j+1]);
      j++;
    }
    if(j)dp[i]=cur+1;
    for(int k=i-1;k>j;k--){
      if(abs(p[k].x-p[i].x)+abs(p[k].y-p[i].y)<=p[i].t-p[k].t){
        dp[i]=max(dp[i],dp[k]+1);
      }
    }
  }
  cout<<*max_element(dp+1,dp+1+n);
  return 0;
}

相關文章