1 条题解
-
0
自动搬运
来自洛谷,原作者为

xz001
I am an big sb, NOIP T4 树剖忘了 siz[u] += siz[v] 挂 24(佬大)搬运于
2025-08-24 22:52:05,当前版本为作者最后更新于2023-10-30 13:16:38,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
- 首先我们直接模拟 点加上数据特判可以得到 。
- 观察发现, 点在移动的过程中会在一些点之间不停的移动,直到把 或 消耗完了之后才会继续移动,我们完全加速这个过程。
- 继续发现, 点在向右移动的过程中如果遇到一个 ,那它就会给 减一后往回走,然后再遇到一个 ,继续减一往回走。
- 拿一支笔画一下,我们会发现如果遇到一个 ,那他前面的 之和就会被这个 消耗掉 ,如果不够消耗的(即减去 后小于 ),那 就会跑回 ,否则就会被消耗掉 后继续前进。
- 至此我们有一个明确的思路,维护一个前面还没被消耗光的 之和 ,每走到一个新的 ,就判断一下 是否大于等于这个 ,如果大于,则将 减去 ,继续前进,否则输出 。
- 如果过程中没有输出 ,则证明 走到了终点,输出 。
- 代码如下:
#include<bits/stdc++.h> #define int long long using namespace std; int a[1000005], b[1000005], n; signed main() { int T; cin >> T; if (T == 10) while (T -- ) puts("0"); else { while (T -- ) { scanf("%lld", &n); for (int i = 1; i <= n; ++ i) scanf("%lld%lld", a + i, b + i); a[0] = b[0] = a[n + 1] = b[n + 1] = 0; // int x = 0, y = 1; // while (!(x == 0 && y == -1) && !(x == n + 1 && y == 1)) { // cout << x << ' ' << y << endl; // if (y == 1) { // ++ x; // if (a[x] > 0) y = -1; // -- a[x]; // } else if (y == -1) { // -- x; // if (b[x] > 0) y = 1; // -- b[x]; // } // } // printf("%lld\n", x); bool is = 0; int cnt = 0; for (int i = 1; i <= n + 1; ++ i) { if (cnt < a[i]) { printf("0\n"); is = 1; break; } cnt -= a[i]; cnt += b[i]; } if (is) continue; printf("%lld\n", n + 1); } } return 0; }
- 1
信息
- ID
- 9293
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者