hdu5919 主席树板子 求调
  • 板块灌水区
  • 楼主Lu_xZ
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/24 15:50
  • 上次更新2024/1/24 15:51:08
查看原帖
hdu5919 主席树板子 求调
963559
Lu_xZ楼主2024/1/24 15:50

Sequence II

#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
#define pb emplace_back
#define All(X) X.begin(), X.end()
using namespace std;
using ll = long long;

struct Node {
	int l, r, v;
};

void solve(int T) { cout << "Case #" << T << ": ";
	int n, m; cin >> n >> m;
	vector<int> a(n + 1), nums;
	rep(i, 1, n) cin >> a[i], nums.pb(a[i]);
	sort(All(nums));
	nums.erase(unique(All(nums)), nums.end());
	rep(i, 1, n) a[i] = lower_bound(All(nums), a[i]) - nums.begin() + 1;
	vector<Node> t(n * 50, {0, 0, 0});
	int idx = 0;
	function<int(int, int)> build = [&](int l, int r) {
		int x = ++ idx;
		if(l == r) return x;
		int mid = l + r >> 1;
		t[x].l = build(l, mid), t[x].r = build(mid + 1, r);
		return x;
	};
	vector<int> root(n + 2, 0);
	root[n + 1] = build(1, n);
	vector<int> mp(n + 1, 0);
	function<int(int, int, int, int, int)> update = [&](int y, int l, int r, int p, int v) {
		int x = ++ idx;
		t[x] = t[y];
		if(l == r) {
			t[x].v = v;
			return x;
		}
		int mid = l + r >> 1;
		if(p <= mid) t[x].l = update(t[y].l, l, mid, p, v);
		else t[x].r = update(t[y].r, mid + 1, r, p, v);
		t[x].v = t[t[x].l].v + t[t[x].r].v;
		return x;
	};
	function<int(int, int, int, int, int)> query = [&](int x, int l, int r, int L, int R) {
		if(L <= l && r <= R) return t[x].v;
		int ret = 0;
		int mid= l + r >> 1;
		if(L <= mid) ret += query(t[x].l, l, mid, L, R);
		if(R > mid) ret += query(t[x].r, mid + 1, r, L, R);
		return ret;
	};
	function<int(int, int, int, int)> find = [&](int x, int l, int r, int v) {
		if(l == r) return l;
		int mid= l + r >> 1;
		if(t[t[x].l].v >= v) return find(t[x].l, l, mid, v);
		else return find(t[x].r, mid + 1, r, v - t[t[x].l].v);
	};
	per(i, n, 1) {
		root[i] = update(root[i + 1], 1, n, i, 1);
		if(mp[a[i]]) root[i] = update(root[i], 1, n, mp[a[i]], 0);
		mp[a[i]] = i;
	}
	int pre = 0;
	rep(i, 1, m) {
		int l, r; cin >> l >> r;
		l = (l + pre) % n + 1, r = (r + pre) % n + 1;
		int k = query(root[l], 1, n, l, r);
		cout << (pre = find(root[l], 1, n, (k + 1) >> 1)) << ' ';
	} cout << '\n';
}

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int T = 1; cin >> T;
	rep(i, 1, T) solve(i);
	return 0;
}
2024/1/24 15:50
加载中...