头条第三题 12% 什么鬼,感觉思路没问题

对字符串累加求四个前缀和数组,
然后每个询问二分求解
没找到坑点,为什么只过了12?

#include <cstdio>

#include <iostream>

#include <algorithm>

#include <string>

using namespace std;

#define mod 1000000007ll

#define LL long long

int max_x[200000], min_x[200000], max_y[200000], min_y[200000];

int bin_max(int *a, int n, int va) {

int ans = 0;

int l = 0, r = n;

while (l <= r) {

int mid = (l + r) / 2;

if (a[mid] < va) {

ans = mid;

l = mid +1;

} else {

r = mid - 1;

}

}

return ans;

}

int bin_min(int *a, int n, int va) {

int ans = 0;

int l = 0, r = n;

while (l <= r) {

int mid = (l + r) / 2;

if (a[mid] > va) {

ans = mid;

l = mid + 1;

} else {

r = mid - 1;

}

}

return ans;

}

int main() {

int tmp_x = 0, tmp_y = 0;

string s;

cin >> s;

for (int i = 0; i < s.size(); i++) {

if (s[i] == 'u') {

tmp_x -= 1;

} else if (s[i] == 'd') {

tmp_x += 1;

} else if (s[i] == 'l') {

tmp_y -= 1;

} else {

tmp_y += 1;

}

max_x[i + 1] = max(max_x[i], tmp_x);

min_x[i + 1] = min(min_x[i], tmp_x);

max_y[i + 1] = max(max_y[i], tmp_y);

min_y[i + 1] = min(min_y[i], tmp_y);

}


int m;

cin >> m;

for (int i = 0; i < m; i++) {

int w, h, x, y;

cin >> w >> h >> x >> y;

int tmp1 = bin_min(min_x, s.size(), -1 * x);

int tmp2 = bin_min(min_y, s.size(), -1 * y);

int tmp3 = bin_max(max_x, s.size(), w - x + 1);

int tmp4 = bin_max(max_y, s.size(), h - y + 1);

int ans = min(tmp1, min(tmp2, min(tmp3, tmp4))) + 1;

cout << min(ans, (int)s.size()) << endl;

}

return 0;

}

/*

uuurrdddddl

3

5 6 3 3

5 6 4 2

6 6 4 2

*/


全部评论
我的感觉也没问题,结果2%
点赞 回复 分享
发布于 2018-04-15 13:13

相关推荐

牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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