【单调栈思路】Minimal Subarray Length UVALive - 6609
2017-07-31 21:00
627 查看
Think:
1知识点:单调栈思路
2题目分析&&反思:比赛时自己用模拟用队列来维护对于当前结点的前面累加和符合大于等于k的最短长度,但是一直Wrong Answer,晚上稍微平息了一点心态,搜了搜题解,发现也是一种维护单调递增序列的思想,和自己比赛时和队友讨论的思路基本一致,之后改了改自己比赛时候写的代码,还是Wrong Answer,内心有点累崩的感觉,希望自己能够知耻后勇,今天比赛队伍基本垫底,赛后听了yj的话,有点伤感,自己一定要加倍努力,成为队伍中的强有力支撑
vjudge题目链接
建议参考博客
以下为Wrong Answer代码——暂未找到错误点
以下为Accepted代码——借鉴前辈代码,谢谢前辈
1知识点:单调栈思路
2题目分析&&反思:比赛时自己用模拟用队列来维护对于当前结点的前面累加和符合大于等于k的最短长度,但是一直Wrong Answer,晚上稍微平息了一点心态,搜了搜题解,发现也是一种维护单调递增序列的思想,和自己比赛时和队友讨论的思路基本一致,之后改了改自己比赛时候写的代码,还是Wrong Answer,内心有点累崩的感觉,希望自己能够知耻后勇,今天比赛队伍基本垫底,赛后听了yj的话,有点伤感,自己一定要加倍努力,成为队伍中的强有力支撑
vjudge题目链接
建议参考博客
以下为Wrong Answer代码——暂未找到错误点
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int inf = 0x3f3f3f3f; int op, tp, link[501400], a[501400]; int main(){ int T, n, k, i, ans; long long sum; scanf("%d", &T); while(T--){ bool flag = false; ans = inf; scanf("%d %d", &n, &k); for(i = 0; i < n; i++){ scanf("%d", &a[i]); if(a[i] >= k){ flag = true; ans = 1; } } if(!flag){ op = tp = 0, sum = 0; for(i = 0; i < n; i++){ if(sum <= 0){ op = 0; tp = 0; sum = 0; } sum += a[i]; link[tp++] = a[i]; while(1) { bool cnt = false; while(sum >= k && tp > op) { ans = min(ans, tp-op); sum -= link[op]; op++; cnt = true; } while(link[op] <= 0 && cnt) { sum = sum - link[op]; op++; } if(!cnt) break; } } } if(ans == inf) printf("-1\n"); else printf("%d\n", ans); } return 0; }
以下为Accepted代码——借鉴前辈代码,谢谢前辈
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int inf = 0x3f3f3f3f; const int N = 5e5 + 4e2; int a , sum , increase ; int main(){ int T, n, k, i, ans, l, r; scanf("%d", &T); while(T--){ scanf("%d %d", &n, &k); sum[0] = 0; for(i = 1; i <= n; i++){ scanf("%d", &a[i]); sum[i] = sum[i-1] + a[i]; } l = r = 0, ans = inf; increase[r++] = 1; for(i = 2; i <= n; i++){ while(l < r && sum[increase[r-1]] >= sum[i]) r--; increase[r++] = i; while(r > l + 1 && sum[i] - sum[increase[l]] >= k){ ans = min(ans, i - increase[l]); l++; } } if(ans == inf) printf("-1\n"); else printf("%d\n", ans); } return 0; }
相关文章推荐
- UVALive_6609_Minimal Subarray Length(RMQ+二分)
- UVALive 6609 Minimal Subarray Length(最大子段)
- UVALive 6609 Minimal Subarray Length (查找+构建排序数组)
- UVALive 6609(Minimal Subarray Length)维护递增序列|RMQ
- UVALive 6609 Minimal Subarray Length (查找+构建排序数组)
- UVALive 6609 Minimal Subarray Length rmq+二分or单调队列
- [J - Minimal Subarray Length UVALive - 6609] 区间问题
- uvalive 6609 - Minimal Subarray Length(离散化+树状数组)
- Uva 6609 - Minimal Subarray Length(RMQ)
- LA 6609 - Minimal Subarray Length
- UVA 12697 Minimal Subarray Length
- Minimal Subarray Length
- HOJ 13006 Minimal Subarray Length (单调队列或RMQ加二分)
- Minimal Subarray Length
- Minimal Subarray Length
- Minimal Subarray Length
- UVaLive 6609 Meeting Room Arrangement (贪心,区间不相交)
- UVA 1611&& UVALive 6588 Crane (贪心思路)
- UVAlive4097 Yungom(思路)
- UVAlive 6623 Battle for Silver(暴力+思路)