Submission #75194

# Submission time Handle Problem Language Result Execution time Memory
75194 2018-09-08T16:42:57 Z Adhyyan1252 Meetings (IOI18_meetings) C++11
0 / 100
5500 ms 40468 KB
#include "meetings.h"
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
struct segment{
	vector<ll> t;
	int n;
	
	segment (int size = 0){
		n = size;
		t.resize(n*2);
	}
	
	segment(vector<ll>& a){
		n = t.size();
		t.resize(n*2);
		for(int i = n; i < 2*n; i++){
			t[i] = a[i-n];
		}
 		for(int i = n-1; i > 0; i--){
			t[i] = max(t[i*2], t[i*2+1]);
		}
	}
	
	void build(){
		for(int i = 0; i < n; i++){
			t[i+n] = t[i];
		}
		for(int i = n-1; i > 0; i--){
			t[i] = max(t[i*2], t[i*2+1]);
		}
	}
	
	ll query(int l, int r){
		ll ans = 0;
		for(l += n, r += n+1; r > l; l>>=1, r>>=1){
			if(l&1) ans = max(ans, t[l++]);
			if(r&1) ans = max(ans, t[--r]);
		}
		return ans;
	}
	
};
#define HMAX 22
segment s[HMAX+1];

vector<int> h;
vector<vector<int> > g;

void preprocess(){
	g.resize(HMAX+1);
	for(int i = 0; i < h.size(); i++)
		g[h[i]].push_back(i);
	for(int i = 0; i <= HMAX; i++){
		s[i] = segment(h.size());
	}
}

ll pre(int l, int r, int val){
	//cout<<"P "<<l<<" "<<r<<" "<<val<<endl;
	if(l > r) return 0;
	if(val == 1){
		for(int i = l; i <= r; i++){
			s[val].t[i] = r - l + 1;
		}
		return r - l + 1;
	}
	if(l == r) return (val - h[l] + 1);
	vector<int>& c = g[val];
	ll ans = 0;
	if(c.size() == 0) ans = pre(l, r, val-1);
	else{
		int lp = lower_bound(c.begin(), c.end(), l) - c.begin();
		int rp = upper_bound(c.begin(), c.end(), r) - c.begin() - 1;
		if(lp == c.size() || c[lp] > r){
			ans = pre(l, r, val-1);
		}else{
			ans = max(ans, pre(l, c[lp]-1, val-1));
			ans = max(ans, pre(c[rp]+1, r, val-1));
			for(int i = lp; i < rp; i++){
				if(c[i] + 1 < c[i+1]) ans = max(ans, pre(c[i]+1, c[i+1]-1, val-1));
			}
		}
	}
	ans += r - l + 1;
	for(int i = l; i <= r; i++){
		s[val].t[i] = ans;
	}
	return ans;
}

ll query(int l, int r, int val, bool lc, bool rc){
	if(l > r) return 0;
	if(l == r) return (val - h[l] + 1);
	if(val == 1) return (r - l + 1);
	vector<int>& c = g[val];
	ll ans = 0;
	int lp = lower_bound(c.begin(), c.end(), l) - c.begin();
	int rp = upper_bound(c.begin(), c.end(), r) - c.begin() - 1;
	if(lp == c.size() || c[lp] > r){
		ans = pre(l, r, val-1);
	}else{	
		if(!lc && !rc){
			ans = s[val-1].query(c[lp], c[rp]);
			ans = max(ans, query(l, c[lp]-1, val-1, false, true));
			ans = max(ans, query(c[rp]+1, r, val-1, true, false));
		}else if(!lc && rc){
			ans = s[val-1].query(c[lp], r);
			ans = max(ans, query(l, c[lp]-1, val-1, false, true));
		}else if(!rc && lc){
			ans = s[val-1].query(l, c[rp]);
			ans = max(ans, query(c[rp]+1, r, val-1, true, false));
		}//else abort();
	}
	ans += r - l + 1;
	return ans;
}

std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L,
                                     std::vector<int> R) {
    //cout<<"WALLA "<<endl;
	int Q = L.size();
	h = H;
	for(int i = 0; i < H.size(); i++){
		if(h[i] > HMAX) return vector<long long>(L.size());
	}
	std::vector<long long> C(Q);
	//cout<<"STARTING"<<endl;
	preprocess();
	pre(0, h.size()-1, HMAX);
	//abort();
	//cout<<"PRE DONE"<<endl;
	for(int i = 0; i <= HMAX; i++){
		s[i].build();
	}
	for(int i = 0; i < Q; i++){
		C[i] = (R[i] - L[i] + 1LL)*(HMAX + 1) - query(L[i], R[i], HMAX, false, false);
	}
  	return C;
}

Compilation message

meetings.cpp: In function 'void preprocess()':
meetings.cpp:53:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < h.size(); i++)
                 ~~^~~~~~~~~~
meetings.cpp: In function 'll pre(int, int, int)':
meetings.cpp:76:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(lp == c.size() || c[lp] > r){
      ~~~^~~~~~~~~~~
meetings.cpp: In function 'll query(int, int, int, bool, bool)':
meetings.cpp:101:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(lp == c.size() || c[lp] > r){
     ~~~^~~~~~~~~~~
meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:125:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < H.size(); i++){
                 ~~^~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 256 KB Output is correct
2 Correct 2045 ms 4572 KB Output is correct
3 Execution timed out 5509 ms 40468 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 256 KB Output is correct
2 Correct 2045 ms 4572 KB Output is correct
3 Execution timed out 5509 ms 40468 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -