萌新求助sb分块题
  • 板块学术版
  • 楼主Ryo_Yamada
  • 当前回复9
  • 已保存回复9
  • 发布时间2020/10/5 14:30
  • 上次更新2023/11/5 11:57:18
查看原帖
萌新求助sb分块题
242543
Ryo_Yamada楼主2020/10/5 14:30

rt,LOJ6279,全 WA

#include <bits/stdc++.h>

using namespace std;

const int N = 100005;

int n, blocksize;
int val[N], blocknum[N], lazy[N];
vector<int> v[1005];

void reset(int x) {
	v[x].clear();
	for(int i = (x - 1) * blocksize + 1; i <= min(x * blocksize, n); i++) v[x].push_back(val[i]);
	sort(v[x].begin(), v[x].end());
}
 
void update(int l, int r, int c) {
	for(int i = l; i <= min(blocknum[l] * blocksize, r); i++) val[i] += c;
	reset(blocknum[l]);
	if(blocknum[l] != blocknum[r]) {
		for(int i = (blocknum[r] - 1) * blocksize + 1; i <= r; i++) val[i] += c;
		reset(blocknum[r]);
	}
	for(int i = blocknum[l] + 1; i < blocknum[r]; i++) lazy[i] += c;
} 


int query(int l, int r, int c) {
	int ret = -1;
	for(int i = l; i <= min(blocknum[l] * blocksize, r); i++) {
		if(val[i] + lazy[blocknum[i]] < c) {
			ret = max(ret, val[i] + lazy[blocknum[i]]);
		}
	}
	if(blocknum[l] != blocknum[r]) {
		for(int i = (blocknum[r] - 1) * blocksize + 1; i <= r; i++) {
			if(val[i] + lazy[blocknum[i]] < c) {
				ret = max(ret, val[i] + lazy[blocknum[i]]);
			}
		}
	}
	for(int i = blocknum[l] + 1; i < blocknum[r]; i++) {
		int x = c - lazy[i];
		vector<int> :: iterator k = lower_bound(v[i].begin(), v[i].end(), x);
		if(k != v[i].end()) {
			int p = k - v[i].begin() - 1;
			ret = max(ret, v[i][p] + lazy[i]);
		}
	}
	return ret;
}

int main() {
	cin >> n;
	blocksize = sqrt(n);
	for(int i = 1; i <= n; i++) scanf("%d", val + i);
	for(int i = 1; i <= n; i++) {
		blocknum[i] = (i - 1) / blocksize + 1;
		v[blocknum[i]].push_back(val[i]);
	}
	for(int i = 1; i <= blocknum[n]; i++) sort(v[i].begin(), v[i].end());
	for(int i = 1; i <= n; i++) {
		int opt, l, r, c;
		scanf("%d%d%d%d", &opt, &l, &r, &c);
		if(!opt) {
			update(l, r, c);
		}
		else printf("%d\n", query(l, r, c));
	}
	return 0;
}
2020/10/5 14:30
加载中...