尝试1(WA)

这玩意样例倒是过了,一交全WA了

先从题解里学了一个全新的读入数据的方法read(),其中getchar()的作用是每次读入一个字符

#include <bits/stdc++.h>
using namespace std;

int read() {
	int x = 0, f = 1;
	char c = getchar();
	while (c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}
//数据范围是10e6
int a[1000010];

int main() {
	int n = read(), m = read();

	for (int i = 0; i < n; i++)
		a[i] = read();
    
	for (int i = 0; i < m; i++) {
		int q = read();
		//lower_bound用于在a,a+n范围内查找第 一 个 大 于 或 者 等 于 q的值的 地 址
        //最后的-a是算出这个值到a[0]的距离
		int ans = lower_bound(a, a + n, q) - a;
		if (q != a[ans])
			printf("-1 ");
		else
			printf("%d ", ans + 1);
        //最后一步再+1 a[i]就是第i+1个数
	}
	return 0;
}

先不急着分析

我们先来看看尝试2

主要注意一下尝试2里的read()函数

尝试2(WA)

#include <bits/stdc++.h>
using namespace std;

int read() {
	int x = 0, f = 1;
	char c = getchar();
	
    //注意这一个while
//	while (c < '0' || c > '9') {
//		if (c == '-')
//			f = -1;
//		c = getchar();
//	}

	while (c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}

int a[1000010];

int main() {
	int n = read(), m = read();
    
	//这次直接下标从1开始
	for (int i = 1; i <= n; i++)
		a[i] = read();
	
    //病急乱投医 先拿个while(m--)代替for循环
	while (m--) {
		int q = read();
		//相应的此处随着下标的变化一起更改
		int ans = lower_bound(a+1, a + n+1, q) - a;

		if (q != a[ans])
			printf("-1 ");
		else
			printf("%d ", ans);
	}
	return 0;
}

十分诡异 被注释的while那一段是用来拦截非法数据的,但是少了这一段就是WA了 //会不会是用来检查空格的

只要把while那一段取消注释就是AC代码

到了这一步我认为这read()估计是进入祖传代码的范畴-不能改了

算了一算最大计算次数 我发现好像没有必要使用read()

于是我把前面尝试2的代码中所有读入全部改成scanf形式

https://www.luogu.com.cn/record/66180351

这玩意过了

我不想多说什么了

还是牢记lower_bound()的用法吧( '-')