Submission #413008

#TimeUsernameProblemLanguageResultExecution timeMemory
413008joseacazSnowball (JOI21_ho_t2)C++17
100 / 100
144 ms17732 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;
 
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define pb push_back
 
const int MAXN = (int)2e5 + 5;
const ll INF = (1LL << 62LL);
int N, Q;
ll a[MAXN], W[MAXN];
pair<ll, int> spacesL[MAXN], spacesR[MAXN];
 
ll l[MAXN], r[MAXN], pos;
ll finalL[MAXN], finalR[MAXN];
 
int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> N >> Q;
	for(int i = 1; i <= N; i++)
		cin >> a[i];
	a[0] = -INF, a[N + 1] = INF;
	for(int i = 0; i <= N + 1; i++)
	{
		if(i < N + 1)
			spacesR[i] = {a[i + 1] - a[i], i};
		else
			spacesR[i] = {0, N + 1};
			
		if(i > 0)
			spacesL[i] = {a[i] - a[i - 1], i};
		else
			spacesL[i] = {0, 0};
	}
	sort(spacesR, spacesR + N + 2);
	sort(spacesL, spacesL + N + 2);
	
	ll delta = 0;
	int lpnt = 0, rpnt = 0;
	for(int q = 1; q <= Q; q++)
	{
		cin >> W[q];
		pos += W[q];
		l[q] = min(l[q - 1], pos);
		r[q] = max(r[q - 1], pos);
		
      	if(l[q] < l[q - 1])
      		delta += l[q - 1] - l[q];
      	if(r[q - 1] < r[q])
          	delta += r[q] - r[q - 1];
		if(l[q] < l[q - 1] || r[q - 1] < r[q])
		{
			for(; lpnt <= N + 1; lpnt++)
			{
				if(spacesL[lpnt].second == 0)
					continue;
				if(spacesL[lpnt].first > delta)
					break;
				int idx = spacesL[lpnt].second;
				finalL[idx] = a[idx] + l[q - 1];
              	if(l[q] < l[q - 1])
                  	finalL[idx] -= (spacesL[lpnt].first - (delta - l[q - 1] + l[q]));
			}
			
			for(; rpnt <= N + 1; rpnt++)
			{
				if(spacesR[rpnt].second == N + 1)
					continue;
				if(spacesR[rpnt].first > delta)
					break;
				int idx = spacesR[rpnt].second;
				finalR[idx] = a[idx] + r[q - 1];
              	if(r[q] > r[q - 1])
                  	finalR[idx] += (spacesR[rpnt].first - (delta - r[q] + r[q - 1]));
			}
		}
	}
	
	for(int i = lpnt; i <= N + 1; i++)
	{
		int idx = spacesL[i].second;
		finalL[idx] = a[idx] + l[Q];
	}
	for(int i = rpnt; i <= N + 1; i++)
	{
		int idx = spacesR[i].second;
		finalR[idx] = a[idx] + r[Q];
	}
	
	for(int i = 1; i <= N; i++)
		cout << finalR[i] - finalL[i] << "\n";
	return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:61:8: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   61 |        if(r[q - 1] < r[q])
      |        ^~
Main.cpp:63:3: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   63 |   if(l[q] < l[q - 1] || r[q - 1] < r[q])
      |   ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...