Submission #1323444

#TimeUsernameProblemLanguageResultExecution timeMemory
1323444PieArmySparklers (JOI17_sparklers)C++20
100 / 100
91 ms9436 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)

const ll inf=2e18;

struct Seg{
	int n;
	vector<ll>mn,mx,arr;
	void build(int node=1,int left=1,int right=-1){
		if(right==-1)right=n;
		if(left==right){
			mn[node]=mx[node]=arr[left-1];
			return;
		}
		build(node*2,left,mid);
		build(node*2+1,mid+1,right);
		mn[node]=min(mn[node*2],mn[node*2+1]);
		mx[node]=max(mx[node*2],mx[node*2+1]);
	}
	void init(vector<ll>Arr){
		arr=Arr;
		n=arr.size();
		mn.clear();
		mx.clear();
		mn.resize(n<<2,inf);
		mx.resize(n<<2,-inf);
		build();
	}
	int l,r;
	ll x;
	int sag(int node=1,int left=1,int right=-1){
		if(right==-1)right=n;
		if(left>r||right<l)return 0;
		if(left>=l&&right<=r){
			if(mx[node]<x)return 0;
			if(left==right)return left;
			if(mx[node*2+1]>=x)return sag(node*2+1,mid+1,right);
			return sag(node*2,left,mid);
		}
		int x=sag(node*2+1,mid+1,right);
		if(x==0)return sag(node*2,left,mid);
		return x;
	}
	int en_sag(int left,int right,ll val){
		l=left;r=right;x=val;
		if(l>r)return 0;
		return sag();
	}
	int sol(int node=1,int left=1,int right=-1){
		if(right==-1)right=n;
		if(left>r||right<l)return n+1;
		if(left>=l&&right<=r){
			if(mn[node]>=x)return n+1;
			if(left==right)return left;
			if(mn[node*2]<x)return sol(node*2,left,mid);
			return sol(node*2+1,mid+1,right);
		}
		int x=sol(node*2,left,mid);
		if(x==n+1)return sol(node*2+1,mid+1,right);
		return x;
	}
	int en_sol(int left,int right,ll val){
		l=left;r=right;x=val;
		if(l>r)return n+1;
		return sol();
	}
};

int n,k;
ll t;
ll arr[100023];
Seg seg;

bool f(ll s){
	ll o=s;
	s*=2*t;
	ll d=0;
	vector<ll>v;
	v.pb(0);
	for(int i=k-1;i>=1;i--){
		d+=s-(arr[i+1]-arr[i]);
		v.pb(d);
	}
	reverse(v.begin(),v.end());
	seg.init(v);
	v.clear();
	d=0;
	v.pb(0);
	for(int i=k+1;i<=n;i++){
		d+=s-(arr[i]-arr[i-1]);
		v.pb(d);
	}
	int p=1;
	while(v.size()){
		ll x=v.back();
		v.pop_back();
		p=seg.en_sag(1,seg.en_sol(p,k,-x)-1,-x)+1;
		if(p==1)return false;
	}
	return p==k+1;
}

signed main(){
	ios_base::sync_with_stdio(23^23);cin.tie(0);
	cin>>n>>k>>t;
	for(int i=1;i<=n;i++){
		cin>>arr[i];
	}
	int l=0,r=1e9;
	while(l<r){
		ll s=(l+r)/2;
		if(f(s))r=s;
		else l=s+1;
	}
	cout<<l<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...