제출 #1119288

#제출 시각아이디문제언어결과실행 시간메모리
1119288hamzabcGlobal Warming (CEOI18_glo)C++14
100 / 100
180 ms40908 KiB
#include <bits/stdc++.h>
 
 
using namespace std;
 
 
#define all(x) x.begin(), x.end()
#define mod 1000000007
#define sp << " " <<
#define endl << '\n'


class lazyporp{
private:
	vector<long long int> lazy;
	vector<pair<long long int, long long int>> tree;
	void push(int node){
		if (node >= lazy.size())
			return;
		if (lazy[node]){
			tree[node].first = tree[node].second = lazy[node];
			if (((node << 1) | 1) < lazy.size())
				lazy[node << 1] = lazy[(node << 1) | 1] = lazy[node];
			lazy[node] = 0;
		}
	}

	void _update(int say, int at, int l, int r, int s){
		push(s);
		push(s << 1);
		push((s << 1) | 1);
		int m = (l + r) >> 1;
		if (at == -1){
			if (l == r){
				tree[s].first = tree[s].second = say;
				return;
			}
			if (tree[s << 1].second >= say){
				_update(say, at, l, m, s << 1);
			}else{
				_update(say, at, m + 1, r, (s << 1) | 1);
			}
		}else{
			if (tree[s].first >= say && at >= r){
				tree[s].first = tree[s].second = lazy[s] = say;
				return;
			}
			if (l == r){
				tree[s].first = tree[s].second = say;
				return;
			}
			if (tree[s << 1].second >= say){
				_update(say, at, l, m, s << 1);
				if (at > m)
					_update(say, at, m + 1, r, (s << 1) | 1);
			}else{
				_update(say, at, m + 1, r, (s << 1) | 1);
			}
		}
		tree[s].first = tree[s << 1].first;
		tree[s].second = tree[(s << 1) | 1].second;
	}

	long long int _count(int l, int r, int s){
		push(s);
		if (tree[s].second != LONG_MAX)
			return r - l + 1;
		if (tree[s].first == LONG_MAX)
			return 0;
		int m = (l + r) >> 1;
		return _count(l, m, s << 1) + _count(m + 1, r, (s << 1) | 1);
	}
public:
	void init(){
		lazy.resize(1600000);
		tree.resize(1600000, { LONG_MAX, LONG_MAX });
	}

	void update(int say){
		_update(say, -1, 0, 200000, 1);
	}

	void update(int say, int at){
		_update(say, at, 0, 200000, 1);
		
	}

	long long int count(){
		return _count(0, 200000, 1);
	}
};


signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	long long int N, D;
	lazyporp LISmanuplated;
	vector<long long int> LISnormal;
	LISmanuplated.init();
	LISmanuplated.update(0);
	LISnormal.push_back(0);
	cin >> N >> D;
	for (int i = 0; i < N; i++){
		long long int in;
		cin >> in;
		auto k = lower_bound(all(LISnormal), in + D);
		LISmanuplated.update(in, k - LISnormal.begin());
		k = lower_bound(all(LISnormal), in);
		if (k == LISnormal.end()){
			LISnormal.push_back(in);
		}else{
			*k = in;
		}
		LISmanuplated.update(in);
	}
	cout << LISmanuplated.count() - 1;
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

glo.cpp: In member function 'void lazyporp::push(int)':
glo.cpp:18:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |   if (node >= lazy.size())
      |       ~~~~~^~~~~~~~~~~~~~
glo.cpp:22:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |    if (((node << 1) | 1) < lazy.size())
      |        ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
#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...