Submission #1296937

#TimeUsernameProblemLanguageResultExecution timeMemory
1296937aegFloppy (RMI20_floppy)C++20
28 / 100
34 ms4476 KiB
#include <bits/stdc++.h>
#include "floppy.h"

using namespace std;

void read_array(int subtask_id, const vector<int> &v) {
	map<int, int> mp;
	vector<int> flt = v;
	sort(flt.begin(), flt.end());
	flt.erase(unique(flt.begin(), flt.end()), flt.end());
	for(int i = 0; i < flt.size(); i ++) mp[flt[i]] = i;
	string ans;
	int n = v.size();
	int lg = 31 - __builtin_clz(n - 1);
	for(int i = 0; i < n; i ++) {
		int cur = mp[v[i]];
		for(int j = lg; j >= 0; j --) {
			if(cur & (1 << j)) ans.push_back('1');
			else ans.push_back('0');
		}
	}
	save_to_floppy(ans);
}

struct segtr {
	int n;
	vector<int> tr;
	vector<int> a;
	segtr(int n, vector<int> const& a):n(n), tr(n << 1, -1), a(a) {
		for(int i = n; i < (n << 1); ++ i) tr[i] = i - n;
		for(int i = n - 1; i > 0; -- i) {
			if(a[tr[i << 1]] > a[tr[i << 1 | 1]]) tr[i] = tr[i << 1];
			else tr[i] = tr[i << 1 | 1];
		}
	}

	int query(int l, int r) {
		int ret = l;
		for(l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
			if(l & 1) {
				if(a[ret] < a[tr[l]])
					ret = tr[l];
				l++;
			}
			if(r & 1) {
				--r;
				if(a[ret] < a[tr[r]]) ret = tr[r];
			}
		}
		return ret;
	}
};

vector<int> solve_queries(int subtask_id, int N, const string &bits, const vector<int> &a, const vector<int> &b) {
	vector<int> ans;
	vector<int> vals;
	int bs = bits.size() / N;
	for(int i = 0; i < bits.size(); i += bs) {
		int crr = 0;
		for(int j = 0; j < bs; j ++) {
			crr <<= 1;
			if(bits[i + j] == '1') crr |= 1;
		}
		vals.push_back(crr);
	}
	segtr tr(N, vals);
	for(int i = 0; i < a.size(); i ++) {
		ans.push_back(tr.query(a[i], b[i]));
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...