1. 程式人生 > >【Codeforces Round #451 (Div. 2) D】Alarm Clock

【Codeforces Round #451 (Div. 2) D】Alarm Clock

force alarm cnblogs bit any inpu size class long long

【鏈接】 我是鏈接,點我呀:)
【題意】


在這裏輸入題意

【題解】


尺取法+二分。
類似滑動窗口。
即左端點為l,右端點為r.
維護a[r]-a[l]+1總是小於等於m的就好。
(大於m就右移左端點)
然後看看裏面的數字個數是不是小於k;
不是的話讓l..r中最右邊那個數字刪掉就好。
->鏈表優化一下即可。

【代碼】

/*
    1.Shoud it use long long ?
    2.Have you ever test several sample(at least therr) yourself?
    3.Can you promise that the solution is right? At least,the main ideal
4.use the puts("") or putchar() or printf and such things? 5.init the used array or any value? 6.use error MAX_VALUE? 7.use scanf instead of cin/cout? 8.whatch out the detail input require */ /* sort(a+1,a+1+n); L[i] = i-1;R[i] = i+1; 一開始l = 1,r = 0,now=0; 然後for (int i = 1;i <= n;i++){
r = i; now++; while(l <= r && a[r]-a[l]+1>m){ now--; l=R[l]; } if(now >=k){ for (int j = i,k = 1;k<=now-k+1;k++,j=L[j]){ delete(j); ans++;
} } now = k-1; } */ #include <bits/stdc++.h> using namespace std; const int N = 2e5; int n,m,k; int a[N+10],L[N+10],R[N+10],ans; void Delete(int pos){ } int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0); cin >> n >> m >> k; for (int i = 1;i <= n;i++) cin >> a[i]; sort(a+1,a+1+n); for (int i = 1;i <= n;i++) L[i] = i-1,R[i] = i+1; R[0] = 1,L[n+1] = n; int l = 1,r = 0,now = 0; for (int i = 1;i <= n;i++){ r = i; now++; while(l <= r && a[r]-a[l]+1>m){ if (a[l]!=0) now--; l=R[l]; } if(now >=k){ a[r] = 0; int ll = L[r],rr = R[r]; R[ll] = rr; L[rr] = ll; now--; ans++; } } cout << ans << endl; return 0; }

【Codeforces Round #451 (Div. 2) D】Alarm Clock