关于题目f的数据问题
在写f的时候因为边界问题wa了几次,没搞明白为什么边界条件考虑好了但是还是wa,所以下来又试了几次
有关二分函数我是这么写的(考试后面换成手写二分了)
auto opt1 = lower_bound(a.begin(), a.begin() + n + 1, lef);
auto opt2 = upper_bound(a.begin(), a.begin() + n + 1, rig);
输入我是由下标1开始输入的,所以a[1]到a[n]是存进去的数字
a[0]则是0。
lower_bound返回第一个大于等于lef的迭代器
upper_bound返回第一个大于等于rig的迭代器
显而易见,当opt1==a.begin()+1,或者opt2==a.begin()+1+n时,找不到数满足<lef或者>rig,输出-1;
题目中给的范围是1<=l<=r<=1e18,理论上来说opt1永远取不到a.begin(),也就是a[0]=0,所以以上边界判断应该是正确的
但是这个代码却ac不了
于是我增加了一个条件,即opt1==a.begin(),这个条件按理来说不应该存在,因为l至少为1,>=l的数不可能为0
但是却ac了
检查了一下,在ac代码中加入了一行
if(lef==0) cout<<"aaa";
如果lef存在0,这个测试点就会不正确,果然wa了。。。
说明lef的范围是包含0的。。。希望题目修正
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <string>
#include <cstdio>
#include <string>
#include <vector>
#include <ctime>
#include <queue>
#include <map>
#include <stack>
#include <iostream>
#include <list>
using namespace std;
vector<long long> a(1008611);
int main()
{
long long n, m;
cin >> n >> m;
long long r, r1, r2;
for (r = 1; r <= n; r++)
{
scanf("%lld", &a[r]);
a[r] += a[r - 1];
//cout << a[r] << ' ';
}
//cout << endl;
for (r = 1; r <= m; r++)
{
long long lef, rig;
scanf("%lld%lld", &lef, &rig);
//if (lef == 0) cout << "aaa"; //将这行代码取消注释即可观察
auto opt1 = lower_bound(a.begin(), a.begin() + n + 1, lef);
auto opt2 = upper_bound(a.begin(), a.begin() + n + 1, rig);
//cout << opt1 << ' ' << opt2 << endl;
if (opt1 == a.begin() + 1 || opt2 == a.begin() + 1 + n|| opt1 == a.begin())
{
printf("-1\n");
continue;
}
opt1--;
printf("%lld\n", *opt2 - *opt1);
}
}