p 存储位置,d 存储能走的距离,cnt1[i] 存储 1 到 i 的割草机中方向向左的数量,vis1[i] 表示从左往右割草,1 到 i 中能与前一个割草机“对接”的数量。
求 hack 或调试!!谢谢QAQ
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,x,y) for(ll i=x;i<=y;i++)
#define pause system("pause")
const ll N=1e5+10;
ll n,p[N],d[N],cnt1[N],cnt2[N],vis1[N],vis2[N];
short dir[N];
int main(){
cin>>n;
rep(i,1,n) cin>>p[i]>>d[i]>>dir[i];
vis1[1]=vis2[n]=1;
cnt1[1]=(dir[1]==-1);
cnt2[n]=(dir[n]==1);
rep(i,2,n){
cnt1[i]=cnt1[i-1]+(d[i]==-1);
vis1[i]=vis1[i-1]+(p[i-1]+d[i-1]>=p[i]);
}
for(ll i=n-1;i>0;i--){
cnt2[i]=cnt2[i+1]+(d[i]==1);
vis2[i]=vis2[i+1]+(p[i+1]-d[i+1]<=p[i]);
}
ll ans=INT_MAX;
if(vis1[n]==n) ans=min(ans,cnt1[n-1]);
// cout<<ans<<'\n';
if(vis2[1]==n) ans=min(ans,cnt2[2]);
// cout<<ans<<'\n';
rep(i,1,n-1){
if(cnt1[i]==i&&cnt2[i+1]==n-i-1&&p[i]+d[i]+d[i+1]>=p[i+1]) ans=min(ans,cnt1[i]+cnt2[i+1]);
}
if(ans<INT_MAX) cout<<ans;
else cout<<-1;
}