Submission #237055

#TimeUsernameProblemLanguageResultExecution timeMemory
237055crossing0verHoliday (IOI14_holiday)C++17
23 / 100
130 ms5936 KiB
#include<bits/stdc++.h>
#include"holiday.h"
#define ll long long 
#define fi first
#define se second
using namespace std;
int n,x,d,val[100005];
ll solveR() {
	set <pair<int,int> >  s;
	ll eaten = 0,ans = val[x];
	int left = 0;
	eaten = val[x];
	s.insert({val[x],x});
	for (int i = x + 1; i < n; i++) {
		int stamina = i + s.size();
		if (i - x >= d) {left = i + 1; break;}
		while (stamina >= d) {
			eaten -= (*s.begin()).fi;
			s.erase(s.begin());
				stamina--;	
		}
		if (stamina < d) {
			eaten += val[i];
			s.insert({val[i],i});
		}
		ans = max(ans,eaten);
	}    
	return ans;				
}
ll solve() {
	set <pair<int,int> >  s;
	set <pair<int,int>,greater< pair<int,int> >  > g;
	ll eaten = 0,ans = val[x];
	int left = 0;
	for (int i = x; i >= 0; i--) {
		s.insert({val[i],i});
		eaten += val[i];
	}
	int l = 0;
	for (int i = x + 1; i < n && i < x + d; i++) {
		s.insert({val[i],i});
		eaten += val[i];
		 int stamina = (i - x + i - l) + s.size();
		 while (stamina > d) {
		 	if (i - x + i - l > d) {
		 		stamina--;
		 		if (s.find({val[l],l}) != s.end()) {
		 			stamina--;
		 			s.erase({val[l],l});
		 			eaten -= val[l];
				 }
		 		l++;
			}
			else {
				if (s.find({val[l],l}) == s.end() && l < x)  {
					l++;
					stamina--;
					continue;
				}
				int in = (*s.begin()).se;
				eaten -= (*s.begin()).fi;
				if (in == l && l < x) {
					l++;
					stamina-=2;
				}
				else 	{
				stamina--;
				if (in >= x)
				g.insert(*s.begin());
			}
				s.erase(s.begin());
			}
		 }
		 if (stamina < d && g.size()) {
		 	s.insert(*g.begin());
		 	g.erase(g.begin());
		 }
		 ans = max(ans,eaten);
	}
	
	return ans;   				
}
ll findMaxAttraction(int n1, int start, int d1, int attraction[]) {
	n = n1;
	x = start;
	d = d1;
	ll ans = 0;
	for (int i = 0; i < n; i ++) val[i] = attraction[i];
	if (!d) return 0;
	if (d == 1) return val[start];
	ans = max(ans,solveR());
	ans = max(ans,solve());
	for (int  i = 0 ;i  < n; i++) val[i] = attraction[n-i];
	x = n - x;
	ans = max(ans,solveR());
	ans = max(ans,solve());	
	return ans;
}        /*
main(){
	freopen("read1.txt","r",stdin);
	freopen("write1.txt","w",stdout);
	int n,start,d;
	cin >> n >> start >> d;
	int att[n];
	for (int i  = 0; i < n ;i ++) cin >> att[i];
	cout << findMaxAttraction(n,start,d,att);
}        */      
						  

Compilation message (stderr)

holiday.cpp: In function 'long long int solveR()':
holiday.cpp:11:6: warning: variable 'left' set but not used [-Wunused-but-set-variable]
  int left = 0;
      ^~~~
holiday.cpp: In function 'long long int solve()':
holiday.cpp:34:6: warning: unused variable 'left' [-Wunused-variable]
  int left = 0;
      ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...