专栏文章

P1695题解

P1695题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minglpo2
此快照首次捕获于
2025/12/02 02:05
3 个月前
此快照最后确认于
2025/12/02 02:05
3 个月前
查看原文

思路

这不就纯模拟。
我们可以从两个方向来推理车流量范围:
  1. 正向推理:从起点到终点,模拟车流量的变化。
  2. 反向推理:从终点到起点,反向推导车流量。
然后将两个方向的结果结合起来,得到最准确的范围。

代码

复杂度 O(n)O(n) ,数据随便过。
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 条评论,欢迎与作者交流。

正在加载评论...