Submission #828997

#TimeUsernameProblemLanguageResultExecution timeMemory
828997arnold518Radio Towers (IOI22_towers)C++17
17 / 100
883 ms11792 KiB
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 1e5;
const int INF = 1e9+7;

int N, A[MAXN+10], cnt;
vector<int> B;

void init(int _N, vector<int> _H)
{
	N=_N;
	for(int i=1; i<=N; i++) A[i]=_H[i-1];

	vector<int> V;
	V.push_back(1);
	for(int i=2; i<=N; i++)
	{
		if(V.size()%2)
		{
			if(A[V.back()]<A[i]) V.push_back(i);
			else V.back()=i;
		}
		else
		{
			if(A[V.back()]>A[i]) V.push_back(i);
			else V.back()=i;
		}
	}
	if(V.size()%2==0) V.pop_back();

	set<int> S;
	set<pii> S2;
	for(int i=0; i<V.size(); i++) S.insert(V[i]);
	for(int i=0; i+1<V.size(); i++) S2.insert({abs(A[V[i+1]]-A[V[i]]), V[i]});
	cnt=V.size()/2+1;
	
	while(!S2.empty())
	{
		//for(auto it : S) printf("%d ", A[it]); printf("\n");
		//for(auto it : S2) printf("%d %d / ", it.first, it.second); printf("\n");
		auto [val, p] = *S2.begin(); S2.erase(S2.begin());
		B.push_back(val);
		auto it=S.find(p);
		int l=-1, r=-1;

		if(it!=S.begin())
		{
			int t1=*prev(it), t2=*it;
			S2.erase({abs(A[t1]-A[t2]), t1});
			l=t1;
		}
		if(next(next(it))!=S.end())
		{
			int t1=*next(it), t2=*next(next(it));
			S2.erase({abs(A[t1]-A[t2]), t1});
			r=t2;
		}
		if(l!=-1 && r!=-1) S2.insert({abs(A[r]-A[l]), l});

		S.erase(*next(it));
		S.erase(it);
	}

	//for(auto it : B) printf("%d ", it);
}

int max_towers(int L, int R, int D) 
{
	L++; R++;
	return cnt-(lower_bound(B.begin(), B.end(), D)-B.begin());
}

Compilation message (stderr)

towers.cpp: In function 'void init(int, std::vector<int>)':
towers.cpp:39:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |  for(int i=0; i<V.size(); i++) S.insert(V[i]);
      |               ~^~~~~~~~~
towers.cpp:40:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |  for(int i=0; i+1<V.size(); i++) S2.insert({abs(A[V[i+1]]-A[V[i]]), V[i]});
      |               ~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...