社区讨论

萌新求调

P2801教主的魔法参与者 3已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@lo352ubq
此快照首次捕获于
2023/10/24 00:55
2 年前
此快照最后确认于
2023/10/24 00:55
2 年前
查看原帖
我知道我确实不该没过样例就来发帖。
但是确实不知道哪里错了。
已经调了 1h。
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int now=0,nev=1; char c=getchar();
	while(!isdigit(c)) { if(c=='-') nev=-1; c=getchar();}
	while(isdigit(c)) { now=(now<<1)+(now<<3)+(c&15); c=getchar(); }
	return now*nev;
}

const int N = 1e6 + 5;
int pos[N], l[N], r[N], add[N], S;
int a[N], b[N], n, m;

void init(){
	for (int i = 1; i <= n; i ++) b[i] = read();
	S = sqrt(n);
	for (int i = 1; i <= S; i ++){
		l[i] = (i - 1) * S + 1;
		r[i] = i * S;
	}
	if (r[S] < n) l[S + 1] = r[S] + 1, r[++ S] = n;
	for (int i = 1; i <= S; i ++){
		sort(b + l[i], b + r[i] + 1);
		for (int j = l[i]; j <= r[i]; j ++)
			pos[j] = i;
	}
}

void update(int L, int R, int k){
	int p = pos[L], q = pos[R];
	if (p == q){
		for (int i = L; i <= R; i ++)
			a[i] += k;
		for (int i = l[p]; i <= r[p]; i ++)
			b[i] = a[i]; 
		sort(b + l[p], b + r[p] + 1);
		return ;
	}
	for (int i = p + 1; i <= q - 1; i ++)
		add[i] += k;
	for (int i = L; i <= r[p]; i ++)
		a[i] += k;
	for (int i = l[p]; i <= r[p]; i ++)
		b[i] = a[i];
	for (int i = l[q]; i <= R; i ++)
		a[i] += k;
	for (int i = l[q]; i <= r[q]; i ++)
		b[i] = a[i];
	sort(b + l[p], b + r[p] + 1);
	sort(b + l[q], b + r[q] + 1);
}

int query(int L, int R, int c){
	int p = pos[L], q = pos[R];
	int cnt = 0;
	if (p == q){
		for (int i = L; i <= R; i ++)
			if (a[i] + add[p] >= c) cnt ++;
		return cnt;
	}
	for (int i = L; i <= r[p]; i ++)
		if (a[i] + add[p] >= c) cnt ++;
	for (int i = l[q]; i <= R; i ++)
		if (a[i] + add[q] >= c) cnt ++;
	for (int i = p + 1; i <= q - 1; i ++){
		int sb1 = l[i], sb2 = r[i];
		while (sb1 < sb2){
			int mid = (sb1 + sb2) >> 1;
			if (b[mid] + add[i] >= c) sb2 = mid;
			else sb1 = mid + 1;
		}
		cnt += r[i] - sb1 + 1;
	}
	return cnt;
}

signed main()
{
	n = read(), m = read();
	for (int i = 1; i <= n; i ++) a[i] = read();
	init();
	while (m --){
        char op; cin >> op;
        if (op == 'M') update(read(), read(), read());
        else cout << query(read(), read(), read()) << "\n";
	}
	return 0;
}

回复

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

正在加载回复...