社区讨论

为什么这两个代码不等效?

AT_abc389_f[ABC389F] Rated Range参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mdprbd8e
此快照首次捕获于
2025/07/30 17:21
7 个月前
此快照最后确认于
2025/11/04 03:28
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define PII pair<int, int>
#define LL long long
using namespace std;
//_________________________________________________________________________________________________________________________________________
const int N = 500009;
int tr[N];
int n, q;

int lowbit(int x){return x & -x;}
void add(int u, int x){
	for(int i = u; i < N; i += lowbit(i)) tr[i] += x;
}
int query(int u){
	int res = 0;
	for(int i = u; i >= 1; i -= lowbit(i)) res += tr[i];
	return res;
}

int fd1(int x){
	int l = 1, r = 5e5;
	while(l < r){
		int mid = (l + r) / 2;
		if(query(mid) >= x) r = mid;
		else l = mid + 1;
	}
	return l;
}
int fd2(int x){
	int l = 1, r = 5e5;
	while(l < r){
		int mid = (l + r + 1) / 2;
		if(query(mid) <= x) l = mid;
		else r = mid - 1;
	}
	return l;
}
int main(){
//	freopen(textin,"r",stdin);
//	freopen(textout,"w",stdout);
	for(int i = 1; i < N; i++) add(i, 1);
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		int l, r;
		scanf("%d%d", &l, &r);
		int min_L = fd1(l);
		int max_R = fd2(r);
		add(fd1(l), 1);
		add(fd2(r) + 1, -1);
	}
	scanf("%d", &q);
	for(int i = 1; i <= q; i++){
		int x;
		scanf("%d", &x);
		printf("%d\n", query(x));
	}

	return 0;
}


CPP
#include<bits/stdc++.h>
#define PII pair<int, int>
#define LL long long
using namespace std;
//_________________________________________________________________________________________________________________________________________
const int N = 500009;
int tr[N];
int n, q;

int lowbit(int x){return x & -x;}
void add(int u, int x){
	for(int i = u; i < N; i += lowbit(i)) tr[i] += x;
}
int query(int u){
	int res = 0;
	for(int i = u; i >= 1; i -= lowbit(i)) res += tr[i];
	return res;
}

int fd1(int x){
	int l = 1, r = 5e5;
	while(l < r){
		int mid = (l + r) / 2;
		if(query(mid) >= x) r = mid;
		else l = mid + 1;
	}
	return l;
}
int fd2(int x){
	int l = 1, r = 5e5;
	while(l < r){
		int mid = (l + r + 1) / 2;
		if(query(mid) <= x) l = mid;
		else r = mid - 1;
	}
	return l;
}
int main(){
//	freopen(textin,"r",stdin);
//	freopen(textout,"w",stdout);
	for(int i = 1; i < N; i++) add(i, 1);
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		int l, r;
		scanf("%d%d", &l, &r);
		int min_L = fd1(l);
		int max_R = fd2(r);
		add(min_L, 1);
		add(max_R + 1, -1);
	}
	scanf("%d", &q);
	for(int i = 1; i <= q; i++){
		int x;
		scanf("%d", &x);
		printf("%d\n", query(x));
	}

	return 0;
}


不同之处在 464946-49 行,第一个WA,第二个AC

回复

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

正在加载回复...