显然从左到右考虑每个要删除的数
维护一个 $cnt$ 表示之前已经删除了 $cnt$ 个数,那么当前所有要删除数的实际位置就要减去 $cnt$
直接暴力枚举哪些数在最左边一个块然后一起删除
每个数删除一次复杂度 $O(n)$
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; inline ll read() { ll x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } const int N=2e5+7; ll m,K,ans; ll n,p[N]; int main() { n=read(),m=read(),K=read(); for(int i=1;i<=m;i++) p[i]=read(); ll cnt=0; for(int i=1;i<=m;i++) { ll r=i; while(r<m && ((p[r+1]-cnt-1)/K==(p[i]-cnt-1)/K) ) r++; cnt+=r-i+1; i=r; ans++; } printf("%lld ",ans); return 0; }