Submission #131516

#TimeUsernameProblemLanguageResultExecution timeMemory
131516gs14004Sparklers (JOI17_sparklers)C++17
100 / 100
188 ms5860 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
using lint = long long;
using pi = pair<int, int>;

int n, k, a[MAXN];
int t;

bool solve(vector<lint> x, vector<lint> y){
	if(x[0] < y[0]) return 0;
	vector<int> sx = {0}, sy = {0};
	for(int i=1; i<x.size(); i++){
		if(x[sx.back()] <= x[i]) sx.push_back(i);
	}
	for(int i=1; i<y.size(); i++){
		if(y[sy.back()] >= y[i]) sy.push_back(i);
	}
	vector<lint> prec;
	for(int i=0; i+1<sy.size(); i++){
		prec.push_back(*max_element(y.begin() + sy[i] + 1, y.begin() + sy[i + 1] + 1));
	}
	int cs = 0, ce = 0;
	for(int i=0; i<sx.size(); i++){
		while(ce + 1 < sy.size()){
			lint nxtmax = prec[ce];
			if(nxtmax <= x[sx[i]]) ce++;
			else break;
		}
		if(i + 1 < sx.size()){
			lint nxtmin = *min_element(x.begin() + sx[i] + 1, x.begin() + sx[i + 1] + 1);
			while(cs <= ce && y[sy[cs]] > nxtmin) cs++;
			if(cs > ce) return 0;
		}
	}
	return ce + 1 == sy.size();
}

bool trial(int s){
	lint L = min(2ll * t * s, 2ll * a[n]);
	vector<lint> vu, vd;
	for(int i=1; i<=n; i++){
		if(i <= k) vu.push_back(a[i] - L * i);
		if(i >= k) vd.push_back(a[i] - L * i);
	}
	reverse(vu.begin(), vu.end());
	int mx1 = max_element(vu.begin(), vu.end()) - vu.begin();
	int mx2 = min_element(vd.begin(), vd.end()) - vd.begin();
	vector<lint> u1, u2, d1, d2;
	for(int i=0; i<=mx1; i++) u1.push_back(vu[i]);
	for(int i=0; i<=mx2; i++) d1.push_back(vd[i]);
	for(int i=mx1; i<vu.size(); i++) u2.push_back(vu[i]);
	for(int i=mx2; i<vd.size(); i++) d2.push_back(vd[i]);
	reverse(u2.begin(), u2.end());
	reverse(d2.begin(), d2.end());
	return solve(u1, d1) && solve(u2, d2);
}

int main(){
	scanf("%d %d %d",&n,&k,&t);
	for(int i=1; i<=n; i++) scanf("%d",&a[i]);
	int s = 0, e = 1e9;
	while(s != e){
		int m = (s+e)/2;
		if(trial(m)) e = m;
		else s = m + 1;
	}
	cout << s << endl;
}

Compilation message (stderr)

sparklers.cpp: In function 'bool solve(std::vector<long long int>, std::vector<long long int>)':
sparklers.cpp:13:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1; i<x.size(); i++){
               ~^~~~~~~~~
sparklers.cpp:16:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1; i<y.size(); i++){
               ~^~~~~~~~~
sparklers.cpp:20:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i+1<sy.size(); i++){
               ~~~^~~~~~~~~~
sparklers.cpp:24:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<sx.size(); i++){
               ~^~~~~~~~~~
sparklers.cpp:25:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(ce + 1 < sy.size()){
         ~~~~~~~^~~~~~~~~~~
sparklers.cpp:30:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(i + 1 < sx.size()){
      ~~~~~~^~~~~~~~~~~
sparklers.cpp:36:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  return ce + 1 == sy.size();
         ~~~~~~~^~~~~~~~~~~~
sparklers.cpp: In function 'bool trial(int)':
sparklers.cpp:52:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=mx1; i<vu.size(); i++) u2.push_back(vu[i]);
                 ~^~~~~~~~~~
sparklers.cpp:53:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=mx2; i<vd.size(); i++) d2.push_back(vd[i]);
                 ~^~~~~~~~~~
sparklers.cpp: In function 'int main()':
sparklers.cpp:60:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d",&n,&k,&t);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~
sparklers.cpp:61:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1; i<=n; i++) scanf("%d",&a[i]);
                          ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...