本文主要是介绍给定排列p(0~n - 1), 定义花费为p的每个前缀的mex的和,排列p可以进行任意次循环左移,求最大花费,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
法一:线段树
#include<bits/stdc++.h>
using namespace std;
#define lson p << 1
#define rson p << 1 | 1
#define int long long
#define pb push_back
const int maxn = 1e6 + 5, inf = 1e9 + 5;
int a[maxn], b[maxn];
int t[maxn << 2], f[maxn];
void push_up(int p){t[p] = min(t[lson], t[rson]);
}
void build(int p, int l, int r){if(l == r){t[p] = inf;return;}int mid = (l + r) >> 1;build(lson, l, mid);build(rson, mid + 1, r);push_up(p);
}
int query(int p, int l, int r, int val){if(l == r){return l;}int mid = (l + r) >> 1;if(t[rson] < val) return query(rson, mid + 1, r, val);else return query(lson, l, mid, val);
}
void insert(int p, int l, int r, int pos, int val){if(l == r){t[p] = val;
这篇关于给定排列p(0~n - 1), 定义花费为p的每个前缀的mex的和,排列p可以进行任意次循环左移,求最大花费的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!