P9019 [USACO23JAN] Tractor Paths P 题解
P9019 [USACO23JAN] Tractor Paths P 题解
难度其实绝对不止蓝题。
先考虑第一问。维护任意两点之间的最短路是困难的,难以 dp 或是采取其它方法解决。难以算最短路就转换思路,考虑从
对于第二问,simple 的想法是枚举 "特殊点"
代码:
#include <bits/stdc++.h>
#define N 200005
#define M 20
using namespace std;
int n, q;
string s, S;
int ls[N], lt, rs[N], rt;
int rk[N << 1];
int sum[N];
int f[N][M], g[N][M];
int sf[N][M], sg[N][M];
int get_dis(int x, int y) {
int ans = 0;
for (int i = M - 1; ~i; --i)
if (f[x][i] < y)
x = f[x][i], ans += (1 << i);
return ans + 1;
}
int main() {
cin >> n >> q;
cin >> s;
s = " " + s;
for (int i = 1; i <= (n << 1); i++) {
if (s[i] == 'L')
ls[++lt] = i, rk[i] = lt;
else
rs[++rt] = i, rk[i] = rt;
}
cin >> S;
S = " " + S;
for (int i = 1; i <= n; i++)
sum[i] = sum[i - 1] + S[i] - '0';
for (int i = 1; i <= n; i++) {
int l = i, r = n, mid = 0, as = 0;
while (l <= r) {
mid = (l + r) >> 1;
if (ls[mid] <= rs[i])
as = mid, l = mid + 1;
else
r = mid - 1;
}
f[i][0] = as;
sf[i][0] = sum[as];
l = 1, r = i, mid = 0, as = 0;
while (l <= r) {
mid = (l + r) >> 1;
if (rs[mid] >= ls[i])
as = mid, r = mid - 1;
else
l = mid + 1;
}
g[i][0] = as;
sg[i][0] = sum[as - 1];
}
for (int j = 1; j < M; j++)
for (int i = 1; i <= n; i++) {
f[i][j] = f[f[i][j - 1]][j - 1];
sf[i][j] = sf[i][j - 1] + sf[f[i][j - 1]][j - 1];
g[i][j] = g[g[i][j - 1]][j - 1];
sg[i][j] = sg[i][j - 1] + sg[g[i][j - 1]][j - 1];
}
while (q--) {
int x, y;
scanf("%d%d", &x, &y);
int ds = get_dis(x, y);
cout << ds << " ";
int ans = S[x] + S[y] - 2 * '0';
for (int i = M - 1; ~i; --i)
if (((ds - 1) >> i) & 1) {
ans += sf[x][i];
x = f[x][i];
ans -= sg[y][i];
y = g[y][i];
}
cout << ans << "\n";
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】