ybtoj:RMQ问题
A:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100005],b[100005][21],l[100005];
int x,y;
void pre(){
for(int i=1;i<=n;i++){
b[i][0]=a[i];
}
for(int j=1;j<=l[n];j++){
for(int i=1;i+(1<<j)-1<=n;i++){
b[i][j]=max(b[i][j-1],b[i+(1<<(j-1))][j-1]);
}
}
}
int main()
{
//cin>>n>>m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
l[0]=-1;
for(int i=1;i<=n;i++){
l[i]=l[i>>1]+1;
}
//cout<<" qwq ";
pre();
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
int k=l[y-x+1];
//cout<<max(b[x][k],b[y-(1<<k)+1][k])<<endl;
printf("%d\n",max(b[x][k],b[y-(1<<k)+1][k]));
}
return 0;
}
B:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[50005],f[50005][21],l[50005];
int ll,rr;
int gcd(int x,int y){
return x%y==0 ? y : gcd(y,x%y);
}
void st(){
for(int i=1;i<=n;i++){
f[i][0]=a[i];
}
for(int j=1;j<=l[n];j++){
for(int i=1;i+(1<<j)-1<=n;i++){
f[i][j]=gcd(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
}
int main(){
//cin>>n>>m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
//cin>>a[i];
scanf("%d",&a[i]);
}
l[0]=-1;
for(int i=1;i<=n;i++){
l[i]=l[i>>1]+1;
}
st();
for(int i=1;i<=m;i++){
//cin>>ll>>rr;
scanf("%d%d",&ll,&rr);
int k=l[rr-ll+1];
printf("%d\n",gcd(f[ll][k],f[rr-(1<<k)+1][k]));
}
return 0;
}
C:
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 0721;
const int s6 = 1e6;
int lst[N], f[N], pre[N], a[N];
int Log[N];
int rmq[N][21];
int loc[N * 10];
int n, m;
inline int query(int l, int r) {
int k = Log[r - l + 1];
return max(rmq[l][k], rmq[r - (1 << k) + 1][k]);
}
int main() {
// freopen("1.txt", "r", stdin);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for (int i = 1; i <= n; ++i) {
lst[i] = loc[a[i] + s6];
loc[a[i] + s6] = i;
}
for (int i = 1; i <= n; ++i) {
pre[i] = max(pre[i - 1], lst[i] + 1);
f[i] = i - pre[i] + 1;
rmq[i][0] = f[i];
}
// for (int i = 1; i <= n; ++i) cout<<i<<" "<<pre[i]<<endl;
Log[0] = -1;
for (int i = 1; i <= n; ++i) Log[i] = Log[i >> 1] + 1;
for (int j = 1; j <= 20; ++j) {
for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
rmq[i][j] = max(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
// cout<<i<<" "<<j<<" "<<rmq[i][j]<<endl;
}
}
while (m--) {
int l, r;
scanf("%d%d", &l, &r);
++l, ++r;
int ll = l, rr = r;
int mid, ans = l - 1;
while (l <= r) {
mid = (l + r) >> 1;
if (pre[mid] < ll) {
ans = mid;
l = mid + 1;
}
else
r = mid - 1;
}
int res = ans - ll + 1;
if (ans < rr)
res = max(query(ans + 1, rr), ans - ll + 1);
printf("%d\n",res);
}
return 0;
}
D:
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 300;
int f[N][N][11][11];
int Log[N];
int n, m, K;
inline int query(int x1, int y1, int x2, int y2) {
int k = Log[x2 - x1 + 1], h = Log[y2 - y1 + 1];
int max1 = max(f[x1][y1][k][h], f[x2 - (1 << k) + 1][y1][k][h]);
int max2 = max(f[x1][y2 - (1 << h) + 1][k][h], f[x2 - (1 << k) + 1][y2 - (1 << h) + 1][k][h]);
return max(max1, max2);
}
int main() {
scanf("%d%d%d", &n, &m, &K);
Log[0] = -1;
for (int i = 1; i <= max(n, m); ++i) Log[i] = Log[i >> 1] + 1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) scanf("%d", &f[i][j][0][0]);
}
for (int k = 0; k <= Log[n]; ++k) {
for (int h = 0; h <= Log[m]; ++h) {
for (int i = 1; i + (1 << k) - 1 <= n; ++i) {
for (int j = 1; j + (1 << h) - 1 <= m; ++j) {
if (k == 0 && h == 0) continue;
if (k != 0)
f[i][j][k][h] = max(f[i][j][k - 1][h], f[i + (1 << (k - 1))][j][k - 1][h]);
else
f[i][j][k][h] = max(f[i][j][k][h - 1], f[i][j + (1 << (h - 1))][k][h - 1]);
}
}
}
}
while (K--) {
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
printf("%d\n",query(x1, y1, x2, y2));
}
return 0;
}
E:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+99;
struct point{
int x,y;
bool operator<(const point&rhs) const{
return x<rhs.x;
}
}d[N];
const int logn=17;
int X[N],Max[N][logn+1],Min[N][logn+1],logg[N];
int getmin(int l,int r){
int s=logg[r-l+1];
return min(Min[l][s],Min[r-(1<<s)+1][s]);
}
int getmax(int l,int r){
int s=logg[r-l+1];
return max(Max[l][s],Max[r-(1<<s)+1][s]);
}
int n,D;
bool check(int lim){
for(int l=1,r=1;l<=n;l++){
while(r<n && X[r+1]-X[l]<=lim) r++;
if(getmax(l,r)-getmin(l,r)>=D) return 1;
}
return 0;
}
int main(){
freopen("flowerplot.in","r",stdin);
freopen("flowerplot.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>D;
for(int i=1;i<=n;i++){
cin>>d[i].x>>d[i].y;
}
sort(d+1,d+1+n);
for(int i=1;i<=n;i++){
X[i]=d[i].x;
}
int tot=unique(X+1,X+1+n)-X-1;
for(int i=1;i<=tot;i++){
Min[i][0]=1e6,Max[i][0]=0;
}
for(int i=1;i<=n;i++){
int x=lower_bound(X+1,X+1+tot,d[i].x)-X;
Min[x][0]=min(Min[x][0],d[i].y);
Max[x][0]=max(Max[x][0],d[i].y);
}
n=tot;logg[0]=-1;
for(int i=1;i<=n;i++){
logg[i]=logg[i>>1]+1;
}
for(int j=1;j<=logn;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
Min[i][j]=min(Min[i][j-1],Min[i+(1<<j-1)][j-1]);
Max[i][j]=max(Max[i][j-1],Max[i+(1<<j-1)][j-1]);
}
}
int L=0,R=1e6+1;
while(L<R){
int Mid=L+R>>1;
if(check(Mid)) R=Mid;
else L=Mid+1;
}
if(R<=1e6)cout<<R<<"\n";
else cout<<-1<<"\n";
return 0;
}
F:
点击查看代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
namespace steven24 {
const int N = 801;
const int inf = 0x7fffffff;
int maxn[10][N][N];
int minn[10][N][N];
int d[N][N];
char opt[4];
int n, m;
inline int read() {
int xr = 0;
char cr;
while (cr = getchar(), cr < '0' || cr > '9') ;
while (cr >= '0' && cr <= '9')
xr = (xr << 3) + (xr << 1) + (cr ^ 48), cr = getchar();
return xr;
}
void init() {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) d[i][j] = d[i][j - 1] + maxn[0][i][j];
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) d[i][j] += d[i - 1][j];
}
for (int i = 1; i <= n; ++i)
for (int k = 1; k <= 9; ++k)
for (int j = 1; j + (1 << k) - 1 <= m; ++j)
maxn[k][i][j] = max(maxn[k - 1][i][j], maxn[k - 1][i][j + (1 << (k - 1))]),
minn[k][i][j] = min(minn[k - 1][i][j], minn[k - 1][i][j + (1 << (k - 1))]);
}
inline int query_sum(int x1, int y1, int x2, int y2) {
return d[x2][y2] - d[x2][y1 - 1] - d[x1 - 1][y2] + d[x1 - 1][y1 - 1];
}
inline int query_max(int x, int l, int r) {
int k = __lg(r - l + 1);
return max(maxn[k][x][l], maxn[k][x][r - (1 << k) + 1]);
}
inline int query_min(int x, int l, int r) {
int k = __lg(r - l + 1);
return min(minn[k][x][l], minn[k][x][r - (1 << k) + 1]);
}
void main() {
n = read(), m = read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
minn[0][i][j] = maxn[0][i][j] = read();
init();
int T = read();
while (T--) {
scanf("%s", opt);
int x1, x2, y1, y2;
x1 = read(), y1 = read(), x2 = read(), y2 = read();
++x1, ++y1, ++x2, ++y2;
if (opt[1] == 'U') printf("%d\n", query_sum(x1, y1, x2, y2));
else if (opt[1] == 'A') {
int ans = 0;
for (int i = x1; i <= x2; ++i) ans = max(ans, query_max(i, y1, y2));
printf("%d\n", ans);
} else {
int ans = inf;
for (int i = x1; i <= x2; ++i) ans = min(ans, query_min(i, y1, y2));
printf("%d\n", ans);
}
}
}
}
int main() {
steven24::main();
return 0;
}
G:
点击查看代码
#include <bits/stdc++.h>
using namespace std;
namespace steven24 {
const int N = 5e4 + 0721;
int maxn[21][N];
bool exist[21][N];
int Log[N];
int yy[N];
int n, m;
struct node {
int y, r;
} a[N];
void init() {
for (int i = 2; i <= n; ++i) Log[i] = Log[i >> 1] + 1;
for (int i = 1; i <= n; ++i) maxn[0][i] = a[i].r;
for (int j = 1; j <= Log[n]; ++j) {
for (int i = 1; i + (1 << j) - 1 <= n; ++i) maxn[j][i] = max(maxn[j - 1][i], maxn[j - 1][i + (1 << (j - 1))]);
}
for (int i = 1; i < n; ++i) {
if (a[i + 1].y == a[i].y + 1) exist[1][i] = 1;
else exist[1][i] = 0;
}
for (int j = 2; j <= Log[n]; ++j) {
for (int i = 1; i + (1 << j) - 1 <= n; ++i) exist[j][i] = (exist[j - 1][i] & exist[j - 1][i + (1 << (j - 1))]);
}
}
int query_max(int l, int r) {
if (l > r) return 0;
int k = Log[r - l + 1];
return max(maxn[k][l], maxn[k][r - (1 << k) + 1]);
}
bool query_exist(int l, int r) {
int k = Log[r - l + 1];
return (exist[k][l] & exist[k][r - (1 << k) + 1]);
}
void main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d%d", &a[i].y, &a[i].r);
yy[i] = a[i].y;
}
init();
scanf("%d", &m);
while (m--) {
int x, y;
scanf("%d%d", &x, &y);
int flag1 = -1, flag2 = -1, flag3 = -1;
bool existz;
int locx = lower_bound(yy + 1, yy + 1 + n, x) - yy - 1;
int locy = lower_bound(yy + 1, yy + 1 + n, y) - yy;
if (a[locx + 1].y == x) ++locx;
if (a[locx].y == x && a[locy].y == y) existz = query_exist(locx, locy);
else if (a[locx].y == x) existz = query_exist(locx, locy - 1);
else if (a[locy].y == y) existz = query_exist(locx + 1, locy);
else existz = query_exist(locx + 1, locy - 1);
if (a[locx].y == x && a[locy].y == y && a[locx].r >= a[locy].r) flag1 = 1;
else if (a[locx].y == x && a[locy].y == y && a[locx].r < a[locy].r) flag1 = 0;
if (existz && a[locx].y == x && a[locx].r > query_max(locx + 1, locy - 1)) flag2 = 1;
else if (a[locx].y == x && a[locx].r <= query_max(locx + 1, locy - 1)) flag2 = 0;
if (existz && a[locy].y == y && a[locy].r > query_max(locx + 1, locy - 1)) flag3 = 1;
else if (a[locy].y == y && a[locy].r <= query_max(locx + 1, locy - 1)) flag3 = 0;
if (flag1 == 1 && flag2 == 1 && flag3 == 1) printf("true\n");
else if (flag1 == 0 || flag2 == 0 || flag3 == 0) printf("false\n");
else printf("maybe\n");
}
}
}
int main() {
steven24::main();
return 0;
}
H:
点击查看代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 500721;
int c[N], rmq[N][21], num[N][21];
int n, k, l, r;
ll ans;
struct node {
int st, enl, enr, en, val;
friend bool operator<(node x, node y) { return x.val < y.val; }
};
priority_queue<node, vector<node>, less<node> > q;
int qwz(int le, int ri) {
int j = log2(ri - le + 1);
if (rmq[le][j] < rmq[ri + 1 - (1 << j)][j])
return num[ri + 1 - (1 << j)][j];
else
return num[le][j];
}
int main() {
scanf("%d%d%d%d", &n, &k, &l, &r);
for (int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
c[i] = c[i - 1] + x;
rmq[i][0] = c[i];
num[i][0] = i;
}
for (int j = 1; j <= 20; ++j) {
for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
if (rmq[i][j - 1] < rmq[i + (1 << (j - 1))][j - 1]) {
rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
num[i][j] = num[i + (1 << (j - 1))][j - 1];
} else {
rmq[i][j] = rmq[i][j - 1];
num[i][j] = num[i][j - 1];
}
}
}
for (int i = 1; i + l - 1 <= n; ++i) {
int zuo = i + l - 1;
int you = min(i + r - 1, n);
q.push((node){ i, zuo, you, qwz(zuo, you), c[qwz(zuo, you)] - c[i - 1] });
// cout<<i<<" "<<zuo<<" "<<you<<" "<<qwz(zuo,you)<<" "<<c[qwz(zuo,you)]-c[i-1]<<endl;
}
while (k--) {
int sta = q.top().st, lef = q.top().enl, righ = q.top().enr, wei = q.top().en, v = q.top().val;
q.pop();
ans += v;
if (lef < wei)
q.push((node){ sta, lef, wei - 1, qwz(lef, wei - 1), c[qwz(lef, wei - 1)] - c[sta - 1] });
if (wei < righ)
q.push((node){ sta, wei + 1, righ, qwz(wei + 1, righ), c[qwz(wei + 1, righ)] - c[sta - 1] });
}
printf("%lld", ans);
return 0;
}
I:
点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define ls (k << 1)
#define rs (k << 1 | 1)
#define mid ((l + r) >> 1)
using namespace std;
namespace Main {
const int N = 3e5 + 0721;
int a[N], dep[N];
int lv[N], rv[N];
int n;
ll ans;
struct segment_tree {
int lazy[N << 2];
inline void pushdown(int k) {
lazy[ls] = lazy[k];
lazy[rs] = lazy[k];
lazy[k] = -1;
}
void modify(int k, int l, int r, int u, int v, int val) {
if (u <= l && v >= r) {
lazy[k] = val;
return;
}
if (lazy[k] != -1) pushdown(k);
if (u <= mid) modify(ls, l, mid, u, v, val);
if (v > mid) modify(rs, mid + 1, r, u, v, val);
}
int query(int k, int l, int r, int loc) {
if (l == r) {
return lazy[k];
}
if (lazy[k] != -1) pushdown(k);
if (loc <= mid) return query(ls, l, mid, loc);
else return query(rs, mid + 1, r, loc);
}
} seg;
inline int read() {
int xr = 0, F = 1;
char cr;
while (cr = getchar(), cr < '0' || cr > '9') if (cr == '-') F = -1;
while (cr >= '0' && cr <= '9')
xr = (xr << 1) + (xr << 3) + (cr ^ 48), cr = getchar();
return xr * F;
}
void main() {
n = read();
for (int i = 1; i <= n; ++i) a[i] = read();
memset(seg.lazy, -1, sizeof seg.lazy);
dep[a[1]] = 0;
seg.modify(1, 1, n, 1, n, a[1]);
lv[a[1]] = 1;
rv[a[1]] = n;
printf("%lld\n", ans);
for (int i = 2; i <= n; ++i) {
int val = seg.query(1, 1, n, a[i]);
if (val == a[i]) continue;
dep[a[i]] = dep[val] + 1;
ans += dep[a[i]];
printf("%lld\n", ans);
if (val > a[i] && lv[val] <= val - 1) {
seg.modify(1, 1, n, lv[val], val - 1, a[i]);
lv[a[i]] = lv[val];
rv[a[i]] = val - 1;
}
else if (val < a[i] && rv[val] >= val + 1) {
seg.modify(1, 1, n, val + 1, rv[val], a[i]);
lv[a[i]] = val + 1;
rv[a[i]] = rv[val];
}
}
}
}
int main() {
Main::main();
return 0;
}

浙公网安备 33010602011771号