专栏文章
P1695题解
P1695题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minglpo2
- 此快照首次捕获于
- 2025/12/02 02:05 3 个月前
- 此快照最后确认于
- 2025/12/02 02:05 3 个月前
思路
我们可以从两个方向来推理车流量范围:
- 正向推理:从起点到终点,模拟车流量的变化。
- 反向推理:从终点到起点,反向推导车流量。
然后将两个方向的结果结合起来,得到最准确的范围。
代码
复杂度 ,数据随便过。
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1e18;
const int N = 111;
struct node{
int l, r;
};
node add(node a, node b){
return {a.l + b.l, a.r + b.r};
}
node sub(node a, node b){
return {a.l - b.r, a.r - b.l};
}
node inter(node a, node b){
return {max(a.l, b.l), min(a.r, b.r)};
}
string op[N];
node val[N], fw[N], bw[N];
signed main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> op[i] >> val[i].l >> val[i].r;
}
// 正向处理
fw[0] = {0, INF};
for(int i = 1; i <= n; i++){
if(op[i] == "on")
fw[i] = add(fw[i-1], val[i]);
else if(op[i] == "off")
fw[i] = sub(fw[i-1], val[i]);
else
fw[i] = inter(fw[i-1], val[i]);
}
// 反向处理
bw[n+1] = {0, INF};
for(int i = n; i >= 1; i--){
if(op[i] == "on")
bw[i] = sub(bw[i+1], val[i]);
else if(op[i] == "off")
bw[i] = add(bw[i+1], val[i]);
else
bw[i] = inter(bw[i+1], val[i]);
}
node st = inter(fw[0], bw[1]);
node ed = inter(fw[n], bw[n+1]);
cout << st.l << " " << st.r << endl;
cout << ed.l << " " << ed.r << endl;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...