MnZn刚学分块求助
  • 板块学术版
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/28 11:50
  • 上次更新2024/12/28 15:46:35
查看原帖
MnZn刚学分块求助
608410
封禁用户楼主2024/12/28 11:50

P7446, 虽然样例不过但是不想看看不出问题了

#include<bits/stdc++.h>

//#define INF 2147483647
#define HDF 1
#define loves ==
#define YDMY 1

namespace IO {
	inline int read() {
		int ret = 0, f = 1;char ch = getchar();
		while (ch < '0' || ch > '9') {
			if (ch == '-') f = -f;
			ch = getchar();
		}
		while (ch >= '0' && ch <= '9') {
			ret = (ret << 1) + (ret << 3) + (ch ^ 48);
			ch = getchar();
		}
		return ret * f;
	}
	void write(int x) {
		if (x < 0) putchar('-'), x = -x;
		if (x > 9) write(x / 10);
		putchar(x % 10 + '0');
	}
} 

using namespace IO;
using namespace std;

const int maxn = 2e5 + 500;
const int qmaxn = 500 + 5;

int n, m;
int a[maxn], L[qmaxn], R[qmaxn], num[maxn], f[maxn], lazy[maxn], lastans;

void init() {
	int x = sqrt(n);

    for (int i = 1;i <= x;i++) {
        L[i] = (i - 1) * x + 1;
        R[i] = i * x;
        for (int j = L[i];j <= R[i];j++) {
            num[j] = i;
            f[j] = (a[j] < L[i]) ? a[j] : f[a[j]];
        }
    }

    if (R[x] != n) {
        x++;
        L[x] = R[x - 1] + 1;
        R[x] = n;
        for (int i = L[x];i <= R[x];i++) {
            num[i] = x;
            f[i] = (a[i] < L[i]) ? a[i] : f[a[i]];
        }
    }

    return;
}

void renewf(int l, int r) {
	for (int i = l;i <= r;i++) {
		if (i - max(a[i] - lazy[num[i]], 1) < L[num[i]]) f[i] = i - max(a[i] - lazy[num[i]], 1);
		else f[i] = f[i] - max(a[i] - lazy[num[i]], 1);
	}
	
	return;
}

void update(int l, int r, int x) {
    int lk = num[l], rk = num[r];
	
	if (lk == rk) {
		for (int i = l;i <= r;i++) a[i] -= x;
		renewf(l, r);
		return;
	} 
	
	for (int i = l;i <= R[lk];i++) a[i] -= x;
	
	for (int i = lk + 1;i < rk;i++) lazy[i] += x;
	
	for (int i = L[rk];i <= r;i++) a[i] -= x;
	
	renewf(l, r);
	
	return; 
}

int query(int x, int y) {
	int xk, yk;
	
	while (HDF loves YDMY) {
		xk = num[x], yk = num[y];
		
		if (xk != yk) {
			if (xk < yk) {y = f[y];continue;}
			else {x = f[x];continue;}
		}
		else {
			if (f[x] == f[y]) {
				while (HDF loves YDMY) {
					a[x] = max(a[x], 1);a[y] = max(a[y], 1);
					if (a[x] == a[y]) return a[x];
					else if (a[x] < a[y]) y = max(a[y] - lazy[yk], 1);
					else x = max(a[x] - lazy[xk], 1);
				}
			}
			else x = f[x], y = f[y];
		}
	} 
}

int main() {
	n = read();
	for (int i = 1;i <= n;i++) a[i] = read();
	
	init();
	
	m = read();
	
	while (m--) {
		int op = read(), j = read(), k = read(), l;
		if (op == 1) l = read(), update(j ^ lastans, k ^ lastans, l ^ lastans);
		else lastans = query(j ^ lastans, k ^ lastans), write(lastans), puts("");
	}
	
	return 0;
}
2024/12/28 11:50
加载中...