どうやら削除する各番号を考慮し、左から右へ
$ cntの$は、あなたがそれを削除したいすべての数字の現在の実際の位置が$ CNT $を差し引かれます、それは$のCNTの$番号を削除したことを言っ維持するために先立ち
左せる直接暴力の数を列挙して、ブロックを削除
たびに削除された複雑$ O(n)の$の数
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> 使用して 名前空間STD。 typedefの長い 長いLL。 インライン読み取り11() { LL、X = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1。CH = GETCHAR()。} 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 2E5 + 7 。 LLのM、K、ANS。 LL N、P [N]。 INT メイン() { N =(読み取り)、M =(読み取り)、Kは= 読み取ります(); 用(int型 iは= 1 P [I] =; I <= M I ++)は(読み取り); LL CNT = 0 。 以下のための(int型I = 1 ; I <= M; iは++ ) { LLのR = I。一方、(R <M &&((P [R + 1 ] -cnt- 1)/ K ==(P [i]が-cnt- 1)/ K))R ++ 。 CNT + = R-I + 1。I = R。ANS ++ ; } のprintf(" %LLDする\ n " 、ANS)。 リターン 0 ; }