题解:P16440 [XJTUPC 2026] 公式战士

· · 题解

显然取 min 或者 max 更优。

关于赛时的题面错误,主要是整个出题组,以及十来个验题队都没看出来。我也觉得很神秘。

多测的原因是,我发现我不能造出单测高质量的数据。这个保证任意操作后 1\le x\le 10^{18} 导致这题数据比较难造。

简单给两个我认为不错的实现。

std 实现如下:

#include <bits/stdc++.h>
using namespace std;

using ll=long long;

ll get(string e,ll x) {
    if (e=="x") return x;
    else return stoll(e);
}
ll calc(string e1,string op,string e2,ll x) {
    ll a=get(e1,x),b=get(e2,x);
    if (op=="+") return a+b;
    else if (op=="-") return a-b;
    else if (op=="*") return a*b;
    else return a/b;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int T; cin>>T;
    while (T--) {
        ll n,x; cin>>n>>x;
        ll mn=x,mx=x;
        for (int i=1;i<=n;i++) {
            string e1,op1,e2,e3,op2,e4;
            cin>>e1>>op1>>e2>>e3>>op2>>e4;
            ll v1=calc(e1,op1,e2,mn);
            ll v2=calc(e1,op1,e2,mx);
            ll v3=calc(e3,op2,e4,mn);
            ll v4=calc(e3,op2,e4,mx);
            mn=min({v1,v2,v3,v4});
            mx=max({v1,v2,v3,v4});
        }
        cout<<mx<<'\n';
    }
}

一份使用 python eval 的实现,使用了 ShwStone 的代码。

特地为这种时限,将数据范围压缩了一下。

for _ in range(int(input())):
    n, x_val = map(int, input().split())
    mi = ma = x_val

    for _ in range(n):
        s = [s.replace('/', '//') for s in input().split()]
        e1, e2 = "".join(s[:3]), "".join(s[3:])

        res = [eval(e, {'x': v}) for e in (e1, e2) for v in (mi, ma)]
        mi, ma = min(res), max(res)

    print(ma)

当然不可能所有选手都写出这么优雅的实现。