Submission #408713

# Submission time Handle Problem Language Result Execution time Memory
408713 2021-05-19T14:19:48 Z codebuster_10 Sails (IOI07_sails) C++17
100 / 100
264 ms 7376 KB
#include <bits/stdc++.h>

using namespace std ;

#define int int64_t //be careful about this 
#define endl "\n"
#define f(i,a,b) for(int i=int(a);i<int(b);++i)

#define pr pair
#define ar array
#define fr first
#define sc second
#define vt vector
#define pb push_back
#define eb emplace_back
#define LB lower_bound  
#define UB upper_bound
#define PQ priority_queue

#define sz(x) ((int)(x).size())
#define all(a) (a).begin(),(a).end()
#define allr(a) (a).rbegin(),(a).rend()
#define mem0(a) memset(a, 0, sizeof(a))
#define mem1(a) memset(a, -1, sizeof(a))

template<class A> void rd(vt<A>& v);
template<class T> void rd(T& x){ cin >> x; }
template<class H, class... T> void rd(H& h, T&... t) { rd(h) ; rd(t...) ;}
template<class A> void rd(vt<A>& x) { for(auto& a : x) rd(a) ;}

template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }

template<typename T>
void __p(T a) {
  cout<<a; 
}
template<typename T, typename F>
void __p(pair<T, F> a) {
  cout<<"{";
  __p(a.first);
  cout<<",";
  __p(a.second);
  cout<<"}\n"; 
}
template<typename T>
void __p(std::vector<T> a) {
  cout<<"{";
  for(auto it=a.begin(); it<a.end(); it++)
    __p(*it),cout<<",}\n"[it+1==a.end()]; 
}
template<typename T, typename ...Arg>
void __p(T a1, Arg ...a) {
  __p(a1);
  __p(a...);
}
template<typename Arg1>
void __f(const char *name, Arg1 &&arg1) {
  cout<<name<<" : ";
  __p(arg1);
  cout<<endl;
}
template<typename Arg1, typename ... Args>
void __f(const char *names, Arg1 &&arg1, Args &&... args) {
  int bracket=0,i=0;
  for(;; i++)
    if(names[i]==','&&bracket==0)
      break;
    else if(names[i]=='(')
      bracket++;
    else if(names[i]==')')
      bracket--;
  const char *comma=names+i;
  cout.write(names,comma-names)<<" : ";
  __p(arg1);
  cout<<" | ";
  __f(comma+1,args...);
}

void setIO(string s = "") {
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); 
  cin.exceptions(cin.failbit); 
	cout.precision(15);	cout << fixed;
  #ifdef ONLINE_JUDGE
  if(sz(s)){
  	freopen((s+".in").c_str(),"r",stdin);
  	freopen((s+".out").c_str(),"w",stdout);
  }
  #define __f(...) 0
  #endif
}

template<class T, class H> struct lazy_segment_tree { 
	const T ID = 0, NEUTRAL_ELEMENT = 0;
  const H NO_OPERATION = 0;
  int size ;
  vector<T> segment_tree;
  vector<H> change;
 
  void apply_lazy_on_change(H &a, H b){ 
    a += b;
  }  
 
  T combiner_function(T a, T b){  
    return max(a,b);
  }
 
  void apply_lazy_on_node(T &a, H b){
    a += b;
  }
    
  void propogate(int x, int lx, int rx){
    if(rx - lx == 1) return ;
    apply_lazy_on_node(segment_tree[2 * x + 1], change[x]); 
    apply_lazy_on_node(segment_tree[2 * x + 2], change[x]);
    apply_lazy_on_change(change[2 * x + 1], change[x]);
    apply_lazy_on_change(change[2 * x + 2], change[x]);
    change[x] = NO_OPERATION;
  }
  
  void init(int n){ 
    size = 1;
    while(size < n) size *= 2;
    segment_tree.assign(2*size, ID); 
		change.assign(2*size, NO_OPERATION); 
  }
  
  void build(const vector<T> &initial){
  	int _size = int(initial.size());
  	init(_size);
  	assert(_size <= size);
  	build(0, 0, size, initial, _size);
  }
  void build(int x, int lx, int rx, const vector<T> &initial, int _size){
  	if(rx - lx == 1){
  		if(x >= size - 1 && x - size + 1 < _size){
  			segment_tree[x] = initial[x - size + 1];
  		}else{
  			segment_tree[x] = ID;
  		}
  	}else{
  		int mid = (lx + rx)/2;
  		build(2 * x + 1, lx, mid, initial, _size);
  		build(2 * x + 2, mid, rx, initial, _size);
  		segment_tree[x] = combiner_function(segment_tree[2 * x + 1], segment_tree[2 * x + 2]);
  	}
  }
  
	void update(int l, int r, int x, int lx, int rx, H value) { 
    propogate(x, lx, rx) ;
    if( lx >= r || l >= rx ){
      return;
    }
    if( lx >= l && rx <= r){
      apply_lazy_on_node(segment_tree[x], value);
      apply_lazy_on_change(change[x], value);  
      return ;
    }
    int mid = (rx + lx)/2 ;
  	update(l, r, 2 * x + 1, lx, mid, value); 
		update(l, r, 2 * x + 2, mid, rx, value); 
		segment_tree[x] = combiner_function(segment_tree[2 * x + 1], segment_tree[2 * x + 2]) ;
		return ;
  }
  
  void update(int l, int r, H value) { 
    update(l, r, 0, 0, size, value) ; return ;
  }
  
  int query(int val, int x, int lx, int rx) { 
    propogate(x, lx, rx);
    if(rx - lx == 1){
    	assert(segment_tree[x] >= val);
    	return x - size + 1; 
    }
    int mid = (rx + lx)/2 ;
    if(segment_tree[2 * x + 1] >= val){
      return query(val, 2 * x + 1, lx, mid);
    }else{
    	return query(val, 2 * x + 2, mid, rx);
    }
  }
  
	int query(int val) { 
		if(segment_tree[0] < val) return -1;
    return query(val, 0, 0, size) ;
  }
  
  T query(int l, int r, int x, int lx, int rx) { 
    propogate(x, lx, rx) ;
    if( lx >= r || l >= rx ){
      return NEUTRAL_ELEMENT;
    }
    if( lx >= l && rx <= r){
      return segment_tree[x] ;
    }
    int mid = (rx + lx)/2 ;
		return combiner_function(query(l, r, 2 * x + 1, lx, mid), query(l, r, 2 * x + 2, mid, rx)) ;
  }
  
	T query(int l, int r) { 
    return query(l, r, 0, 0, size) ;
  }
  
};

void S(vector<int> &h,vector<int> &k){
	vt<pr<int,int>> v;
	f(i,0,sz(h)){
		v.pb({h[i],k[i]});
	}
	sort(all(v));
	f(i,0,sz(h)){
		h[i] = v[i].fr, k[i] = v[i].sc;
	}
}

signed main(){
  setIO();
	int n; rd(n);
	vt<int> h(n), k(n);
	f(i,0,n) rd(h[i],k[i]);
	S(h,k);
	
	lazy_segment_tree<int,int> st;
	int H = h.back();
	vt<int> a(H,0);
	st.build(a);
	
	
	for(int i = 0; i < n; ++i){
		int start = H - h[i];
		int end = start + k[i] - 1;
		int x = st.query(end,end+1);
		int first = st.query(x);
		ckmax(first,start);
		int last = st.query(x+1);
		if(last == -1) last = H;
		--last;
		assert(first <= last);
		st.update(start,first,1);
		k[i] -= (first - start);
		st.update(last-k[i]+1,last+1,1); 
	}
	int ans = 0;
	f(i,0,H){
		int res = st.query(i,i+1);
		ans += res * (res - 1)/2;
	}
	cout << ans;
}
















# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 460 KB Output is correct
2 Correct 30 ms 5240 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 1756 KB Output is correct
2 Correct 50 ms 1736 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 64 ms 2040 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 124 ms 3532 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 219 ms 6320 KB Output is correct
2 Correct 193 ms 7376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 226 ms 6584 KB Output is correct
2 Correct 176 ms 7228 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 264 ms 6808 KB Output is correct
2 Correct 179 ms 5060 KB Output is correct