关于题目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);

}

}

全部评论
已重测
点赞 回复 分享
发布于 05-13 00:05 黑龙江
左边界确实出现了0的问题,已修正,感谢大佬hack
点赞 回复 分享
发布于 05-12 23:44 黑龙江

相关推荐

不愿透露姓名的神秘牛友
07-11 11:16
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务