Submission #431986

#TimeUsernameProblemLanguageResultExecution timeMemory
431986vulpes2Financial Report (JOI21_financial)C++17
17 / 100
546 ms42604 KiB
//#include <atcoder/maxflow.hpp> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> #include <iostream> #include <map> #include <list> #include <set> #include <algorithm> #include <vector> #include <string> #include <functional> #include <queue> #include <deque> #include <stack> #include <unordered_map> #include <unordered_set> #include <cmath> #include <iterator> #include <random> #include <chrono> #include <complex> #include <bitset> #include <fstream> #define forr(i,start,count) for (int i = (start); i < (start)+(count); ++i) #define set_map_includes(set, elt) (set.find((elt)) != set.end()) #define readint(i) int i; cin >> i #define readll(i) ll i; cin >> i #define readdouble(i) double i; cin >> i #define readstring(s) string s; cin >> s typedef long long ll; //using namespace __gnu_pbds; //using namespace atcoder; using namespace std; const ll modd = (1000LL * 1000LL * 1000LL + 7LL); //const ll modd = 998244353; template<class T> class SegmentTree2 { public: SegmentTree2(const vector<T>& data, function<T(T,T)> f_, T zero_value = 0) : zv(zero_value), f(f_) { Initialize(data); } SegmentTree2(int n, function<T(T,T)> f_, T zero_value = 0) : zv(zero_value), f(f_) { vector<T> temp(n, zv); Initialize(temp); } T operator[](int i) { return tree[B+i]; } T GetEvaluation(int L, int R) { // "min/max" on interval [L,R); 0-based indexing, as usual if (R<=L) { return zv; } return GetEvaluationHelper(L, R, 0, B, 1); } void SetVal(int i, T val) { tree[B+i] = val; for(int j = (B + i) / 2; j >= 1; j /= 2) { tree[j] = f(tree[2*j], tree[2*j+1]); } } private: vector<T> tree; int B; // power of two greater than size of input data T zv; function<T(T,T)> f; void Initialize(const vector<T>& data) { B = 1; while(B < data.size()) {B *= 2; } tree = std::move(vector<T>(2*B, zv)); copy(data.begin(), data.end(), next(tree.begin(), B)); for(int i = B - 1; i >= 1; --i) { tree[i] = f(tree[2*i], tree[2*i+1]); } } T GetEvaluationHelper(int L, int R, int start, int length, int tree_index) { if (L==R) { return zv; } if ((L==start) && (R==start+length)) { return tree[tree_index]; } int midpoint = start + length/2; T left_ = zv, right_ = zv; if (L<=min(midpoint,R)) { left_ = GetEvaluationHelper(L, min(midpoint,R), start, length/2, 2*tree_index); } if (max(midpoint,L)<=R) { right_ = GetEvaluationHelper(max(midpoint,L), R, midpoint, length/2, 2*tree_index+1); } return f(left_, right_); } }; int main(int argc, char *argv[]) { mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); uniform_int_distribution<int> rand_gen(0, modd); // rand_gen(rng) gets the rand no ios_base::sync_with_stdio(false); cin.tie(0); cout.precision(12); // readint(test_cases); int test_cases = 1; forr(t, 1, test_cases) { readint(n); readint(d); vector<int> a; forr(i,0,n) { readint(aa); a.push_back(aa); } int res = 0; if (d==1) { res = 1; deque<int> vals; vals.push_back(a.back()); for(int i = n-2; i >= 0; --i) { while ((!vals.empty()) && (vals.front()<=a[i])) { vals.pop_front(); } vals.push_front(a[i]); res = max(res, (int)vals.size()); } } if (d==n) { map<int,vector<int>> freq; forr(i,0,n) { freq[a[i]].push_back(i); } SegmentTree2<int> so_far(vector<int>(n, 0), [](int x, int y){ return max(x,y); }, 0); for(auto x : freq) { for(int i = x.second.size()-1; i >= 0; --i) { so_far.SetVal(x.second[i], 1+so_far.GetEvaluation(0, x.second[i])); } } res = so_far.GetEvaluation(0, n); } cout << res << endl; } return 0; }

Compilation message (stderr)

Main.cpp: In instantiation of 'void SegmentTree2<T>::Initialize(const std::vector<_Tp>&) [with T = int]':
Main.cpp:51:11:   required from 'SegmentTree2<T>::SegmentTree2(const std::vector<_Tp>&, std::function<T(T, T)>, T) [with T = int]'
Main.cpp:146:96:   required from here
Main.cpp:84:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |           while(B < data.size()) {B *= 2;  }
      |                 ~~^~~~~~~~~~~~~
#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...