#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
const int maxn=2e6+10;
vi a(maxn);
int n,d,t;
struct segTree {
struct node {
long double mn=1e9;
long double lzy=0;
int cnt=0;
node(long double _mn=1e9): mn(_mn) {}
};
int sze;
vector<node> nodes;
node unite(node a, node b) {
if (a.mn<=b.mn) {
return a;
}
return b;
}
void push(int v, int tl, int tr) {
nodes[v].mn+=nodes[v].lzy;
if (tl!=tr) {
nodes[2*v].lzy+=nodes[v].lzy;
nodes[2*v+1].lzy+=nodes[v].lzy;
}
nodes[v].lzy=0;
}
segTree(int n): sze(n) {
nodes.resize(4*n);
}
node get(int l, int r, int v, int tl, int tr) {
push(v,tl,tr);
if (l<=tl && tr<=r) {
return nodes[v];
}
if (tr<l || r<tl) {
return node();
}
int tm=tl+(tr-tl)/2;
return unite(get(l,r,2*v,tl,tm),get(l,r,2*v+1,tm+1,tr));
}
node get(int l, int r) {
return get(l,r,1,0,sze-1);
}
void update1(int l, int r, long double add, int v, int tl, int tr) {
push(v,tl,tr);
if (l<=tl && tr<=r) {
nodes[v].lzy+=add;
push(v,tl,tr);
return;
}
if (tr<l || r<tl) {
return;
}
int tm=tl+(tr-tl)/2;
update1(l,r,add,2*v,tl,tm);
update1(l,r,add,2*v+1,tm+1,tr);
nodes[v]=unite(nodes[2*v],nodes[2*v+1]);
}
void update1(int l, int r, long double add) {
update1(l,r,add,1,0,sze-1);
}
void update2(int ind, node val, int v, int tl, int tr) {
push(v,tl,tr);
if (tr<ind || ind<tl) {
return;
}
if (tl==tr) {
nodes[v]=unite(val,nodes[v]);
return;
}
int tm=tl+(tr-tl)/2;
update2(ind,val,2*v,tl,tm);
update2(ind,val,2*v+1,tm+1,tr);
nodes[v]=unite(nodes[2*v],nodes[2*v+1]);
}
void update2(int ind, node val) {
update2(ind,val,1,0,sze-1);
}
};
pi solve(long double pri) {
segTree data(n+1);
data.update2(0,0);
for (int i=0; i<n; i++) {
if (a[i]>t) {
auto temp=data.get(0,n);
temp.cnt++;
temp.mn+=pri;
data.update2(0,temp);
data.update1(i+1,n,1);
}
else {
data.update2(min(n,i+t-a[i]+1),data.get(0,min(n,i+t-a[i]+1)-1));
data.update1(0,min(n,i+t-a[i]+1)-1,1e9);
}
}
pi ret={1e9,1e9};
for (int i=0; i<=n; i++) {
auto temp=data.get(i,i);
ret=min(ret,{(int)round(temp.mn-pri*temp.cnt),temp.cnt});
}
return ret;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> d >> t;
int cnt=0;
int dd=0;
for (int i=0; i<n; i++) {
cin >> a[i];
if (a[i]<=t) {
cnt++;
}
if (i>0 && a[i]>t && a[i-1]<=t) {
dd++;
}
}
d=min(dd,d);
long double l=0,r=n;
pi ans={1e9,1e9};
while (abs(l-r)>=1e-20) {
long double m=l+(r-l)/2;
pi temp=solve(m);
if (temp.se==d) {
ans=min(ans,temp);
break;
}
if (temp.se>d) {
l=m;
}
else {
ans=min(ans,temp);
r=m;
}
}
cout << cnt+ans.fi << '\n';
/*vector<segTree> data(d+1,segTree(n+1));
data[0].update2(0,0);
for (int i=0; i<n; i++) {
for (int k=d; k>=0; k--) {
if (a[i]>t) {
if (k<d) {
data[k+1].update2(0,data[k].get(0,n).mn);
}
data[k].update1(i+1,n,1);
}
else {
data[k].update2(min(n,i+t-a[i]+1),data[k].get(0,min(n,i+t-a[i]+1)-1).mn);
data[k].update1(0,min(n,i+t-a[i]+1)-1,1e9);
}
}
}
ll ans=n;
for (int k=0; k<=d; k++) {
ans=min(ans,(ll)data[k].get(0,n).mn);
}
cout << ans+cnt << '\n';*/
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |