Submission #1009654

#TimeUsernameProblemLanguageResultExecution timeMemory
1009654aaaaaarrozMeetings (IOI18_meetings)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct nodo{
    ll suma;
    ll respuesta;
    ll prefijo;
    ll sufijo;
};
template<class T>
struct SegmentTree{
	T (*merge)(T, T);
	ll n;
	vector<T>ST;
	void build(ll i, ll l, ll r, vector<T> &values){
		if (l == r){
			ST[i] = values[l];
			return;
		}
		build(i * 2, l, (l + r) / 2, values);
		build(i * 2 + 1, (l + r) / 2 + 1, r, values);
		ST[i] = merge(ST[i * 2], ST[i * 2 + 1]);
	}

	SegmentTree(vector<T> &values, T (*merge)(T a, T b)) : merge(merge){
		n = values.size();
		ST.resize(n << 2 | 3);
		build(1, 0, n - 1, values);
	}

	void update(ll i, ll l, ll r, ll pos, T val){
		if (r < pos or l > pos) return;
		if (l == r){
			ST[i] = val;
			return;
		}
		update(i << 1, l, (l + r) >> 1, pos, val);
		update(i << 1 | 1, (l + r) / 2 + 1, r, pos, val);
		ST[i] = merge(ST[i << 1], ST[i << 1 | 1]);
	}

	void update(ll pos, T val){
		update(1, 0, n - 1, pos, val);
	}

	T query(ll i, ll l, ll r, ll a, ll b){
		if (l >= a and r <= b) return ST[i];
		ll mid = (l + r) >> 1;
		if (mid < a)
			return query(i << 1 | 1, mid + 1, r, a, b);
		if (mid >= b) 
			return query(i << 1, l, mid, a, b);
		return merge(query(i << 1, l, mid, a, b), query(i << 1 | 1, mid + 1, r, a, b));
	}

	T query(ll a, ll b){
		if (a > b) return merge(query(1, 0, n - 1, 0, b), query(1, 0, n - 1, a, n - 1));
		return query(1, 0, n - 1, a, b);
	}
};

nodo merge(nodo a,nodo b){
    nodo c;
    c.suma=a.suma+b.suma;
    c.prefijo=max(a.prefijo,a.suma+b.prefijo);
    c.sufijo=max(b.sufijo,b.suma+a.sufijo);
    c.respuesta=max({a.sufijo+b.prefijo,a.respuesta,b.respuesta});
    return c;
}
vector<ll> minimum_costs(vector<int> H, vector<int> L,vector<int> R) {
  ll n=H.size();
  ll Q = L.size();
  vector<ll> C(Q);
  vector<ll>nuevo;
  for(ll i=0;i<n;i++){
	  if(H[i]==2){
		  nuevo.push_back(-INT_MAX);
	  }
	  else{
		  nuevo.push_back(1LL);
	  }
  }
  SegmentTree<nodo>st(nuevo,merge);
  for(ll q=0;q<Q;q++){
	  ll l=L[q];
	  ll r=R[q];
	  ll maxsequenceofones=st.query(l,r);
	  if(maxsequenceofones<=0){
		  C[q]=2*(r-l+1);
	  }
	  else{
		  ll falta=(r-l+1)-(maxsequenceofones);
		  C[q]=(maxsequenceofones+(2*falta));
	  }
  }
  return C;
}

Compilation message (stderr)

meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:83:34: error: no matching function for call to 'SegmentTree<nodo>::SegmentTree(std::vector<long long int>&, <unresolved overloaded function type>)'
   83 |   SegmentTree<nodo>st(nuevo,merge);
      |                                  ^
meetings.cpp:25:2: note: candidate: 'SegmentTree<T>::SegmentTree(std::vector<_Tp>&, T (*)(T, T)) [with T = nodo]'
   25 |  SegmentTree(vector<T> &values, T (*merge)(T a, T b)) : merge(merge){
      |  ^~~~~~~~~~~
meetings.cpp:25:25: note:   no known conversion for argument 1 from 'std::vector<long long int>' to 'std::vector<nodo, std::allocator<nodo> >&'
   25 |  SegmentTree(vector<T> &values, T (*merge)(T a, T b)) : merge(merge){
      |              ~~~~~~~~~~~^~~~~~
meetings.cpp:11:8: note: candidate: 'SegmentTree<nodo>::SegmentTree(const SegmentTree<nodo>&)'
   11 | struct SegmentTree{
      |        ^~~~~~~~~~~
meetings.cpp:11:8: note:   candidate expects 1 argument, 2 provided
meetings.cpp:11:8: note: candidate: 'SegmentTree<nodo>::SegmentTree(SegmentTree<nodo>&&)'
meetings.cpp:11:8: note:   candidate expects 1 argument, 2 provided
meetings.cpp:87:33: error: cannot convert 'nodo' to 'll' {aka 'long long int'} in initialization
   87 |    ll maxsequenceofones=st.query(l,r);
      |                         ~~~~~~~~^~~~~
      |                                 |
      |                                 nodo