Submission #1359472

#TimeUsernameProblemLanguageResultExecution timeMemory
1359472Mamikonm1Sequence (APIO23_sequence)C++20
28 / 100
2095 ms13888 KiB
#include "sequence.h"
#include <iostream>
#include <vector>
#include <cmath>
#include<map>
#include <algorithm>
#include <iomanip>
#include <string>
#include<stack>
#include <set>
#include <queue>
#include <chrono>
#include<array>
#include<bitset>
#include<unordered_map>
#include<random>
#include<cassert>
#include<cstring>
using namespace std;
using ll = long long;
using db = double;
const float pi = 3.14159265359;
#define V vector
#define VI V<int>
#define P pair<int,int>
#define rep(i, a, b, step) for (int i = int(a); i <= int(b); i += step)
#define repl(i,a,b,step) for (int i = int(a); i >= int(b); i -= step)
#define prime(n) [](int x) { for (int i = 2; i *1ll* i <= x; ++i) if (x % i == 0) return false; return x > 1; }(n)
#define printall(container, ch) for (const auto& elem : container) { std::cout << elem << ch; } std::cout << std::endl;
#define sn << '\n'
#define ed << endl
#define sz size()
#define print cout <<
#define debug(x) cerr<< #x << " = " << x sn;
#define mpII map<int,int>   
#define mine min_element    
#define maxe max_element    
#define all(v) begin(v), end(v)
#define txt freopen("snakes.in", "r", stdin); freopen("snakes.out", "w", stdout)    
#define MEX(a) [](VI a){set<int>elem;for(auto&i:a)elem.insert(i);int ret=0;while(elem.count(ret))ret++;return ret;}(a)
#define pb push_back    
#define pq priority_queue
#define rev reverse
#define nuyn(a) a.erase(unique(all(a)), end(a))
#define nx next_permutation         
#define pk pop_back()
#define START print "Start" sn
#define END print "End" sn
#define ff first
#define ss second       
#define ts to_string 
#define ub upper_bound       
#define mk make_pair 
#define lb lower_bound               
#define testcase int t;cin>>t;while(t--)solution();
struct segment_tree {
	int n;
	VI seg;
	segment_tree(int N) {
		n = N * 4;
		seg.resize(n);
	}
	void update(int l, int r, int u, int i) {
		if (l == r) {
			seg[u]++;
			return;
		}
		int md = r + l >> 1;
		if (md < i)update(md + 1, r, u * 2 + 2, i);
		else update(l, md, u * 2 + 1, i);
		seg[u] = seg[u * 2 + 1] + seg[u * 2 + 2];
	}
	int get(int l, int r, int u, int k) {
		if (l == r)return l;
		int md = r + l >> 1;
		if (seg[u * 2 + 1] < k) {
			k -= seg[u * 2 + 1];
			return get(md + 1, r, u * 2 + 2, k);
		}
		return get(l, md, u * 2 + 1, k);
	}
	void clear() {
		rep(i, 0, n - 1, 1)seg[i] = 0;
	}
};
int sequence(int n, std::vector<int> a) {
	int ans = 0;
	segment_tree seg(n + 1);
	VI cnt(n + 1);
	rep(i, 0, n - 1, 1) {
		seg.clear();
		rep(j, 1, n, 1)cnt[j] = 0;
		rep(j, i, n - 1, 1) {
			cnt[a[j]]++;
			seg.update(0, n, 0, a[j]);
			if ((j - i + 1) & 1)ans = max(ans, cnt[seg.get(0, n, 0, (j - i + 1) / 2 + 1)]);
			else ans = max({ ans,cnt[seg.get(0, n, 0, (j - i) / 2 + 1)],cnt[seg.get(0, n, 0, (j - i + 1) / 2 + 1)] });
		}
	}
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...