社区讨论

分块求调

P13983数列分块入门 8参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhj4xw49
此快照首次捕获于
2025/11/03 20:47
4 个月前
此快照最后确认于
2025/11/03 20:47
4 个月前
查看原帖
WA on #3,#15。
cov 是目前区间是否被覆盖,covnum 则是对应的数字
CPP
#include <bits/stdc++.h>
using namespace std;

const int _ = 3e5 + 5;

int n,blo;
int a[_];
int L[_],R[_],id[_],cov[_],covnum[_];

void Push(int x) {
  if(!cov[id[x]]) return;
  cov[id[x]] = 0;
  for(int i = L[id[x]];i <= R[id[x]];i++) a[i] = covnum[id[x]];
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0),cout.tie(0);
  cin >> n;
  blo = sqrt(n);
  for(int i = 1;i <= n;i++) {
  	cin >> a[i];
  }
  for(int i = 1;i <= blo;i++) {
  	L[i] = R[i - 1] + 1;
  	R[i] = n / blo * i;
  }
  if(R[blo] < n) blo++,L[blo] = R[blo - 1] + 1,R[blo] = n;
  for(int i = 1;i <= blo;i++) {
  	for(int j = L[i];j <= R[i];j++) {
  	  id[j] = i;
	}
  }
  for(int i = 1,l,r,c;i <= n;i++) {
  	cin >> l >> r >> c;
  	int ans = 0;
  	if(id[l] == id[r]) {
  	  for(int j = l;j <= r;j++) ans += (a[j] == c),a[j] = c;
	} else {
	  Push(l),Push(r);
	  for(int j = l;j <= R[id[l]];j++) {
	  	ans += (a[j] == c);
		a[j] = c;
	  }
	  for(int j = L[id[r]];j <= r;j++) {
	  	ans += (a[j] == c);
	  	a[j] = c;
	  }
  	  for(int j = id[l] + 1;j < id[r];j++) {
  	  	if(cov[j]) ans += (covnum[j] == c) * (R[j] - L[j] + 1);
  	  	else {
  	  	  for(int k = L[j];k <= R[j];k++) {
  	  	    ans += (a[k] == c);
		  }
		}
  	  	cov[j] = 1,covnum[j] = c;
	  }
	}
	cout << ans << '\n';
  }
  return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...