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;
}
QAQ
posted @ 2025-02-18 22:53  cathyzro  阅读(48)  评论(2)    收藏  举报