为什么这两个代码不等效?
查看原帖
为什么这两个代码不等效?
765139
Aluminium_ranran楼主2025/7/30 17:21
#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;
}


#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

2025/7/30 17:21
加载中...