56pts,RE求调,玄2关!
查看原帖
56pts,RE求调,玄2关!
617020
GJX_Algorithm楼主2024/10/14 20:14
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5, M = 1e7 + 5;
string s;
int m, q, x;
stack<int> stk;
stack<int> stk1;
int mark[N], mk1[N];
struct node
{
    int f, nbr;
    int ll, lr;
    int rl, rr;
};
map<pair<int, int>, node> tree;
void build(int l, int r) //建树
{
    int sum = 0;
    int p_re = 0;
    int flag = -1;
    for (int i = l; i <= r; i++) 
    {
        if (s[i] == '>' || s[i] == '<')
        {
            if (s[i] == '>') flag = 1;
            else flag = 2;
            p_re = i;
            break;
        }
        if (s[i] >= '0' && s[i] <= '9') sum = sum * 10 + (s[i] - '0');
    }
    //cout << flag << " " << p_re << "\n";
    cout << l << " " << r << " " << sum << " " << flag << "\n";
    //p = p_re;
    tree[make_pair(l, r)].f = flag; //存类型
    if (flag == -1) //数字
    {
        tree[make_pair(l, r)].nbr = sum;
        //cout << p << " " << tree[p].f << " " << tree[p].nbr << "\n";
        return ;
    }
    int sum1 = 0;
    for (int i = p_re + 1; i < mk1[p_re]; i++) sum1 = sum1 * 10 + (s[i] - '0');
    tree[make_pair(l, r)].nbr = sum1;
    
    //cout << p << " " << tree[p].f << " " << tree[p].nbr << "\n";
    int ll = tree[make_pair(l, r)].ll = mk1[p_re] + 1;
    int lr = tree[make_pair(l, r)].lr = mark[mk1[p_re]] - 1;
    int rl = tree[make_pair(l, r)].rl = mark[mk1[p_re]] + 1;
    int rr = tree[make_pair(l, r)].rr = r;
    //cout << sum1 << " " << ll << " " << lr << " " << rl << " " << rr << "\n";
    build(ll, lr); //左子树
    build(rl, rr); //右子树
    return ;
}
int query(int l, int r, int num)
{
    if (tree[make_pair(l, r)].f == -1) //数字
        return tree[make_pair(l, r)].nbr;
    if (tree[make_pair(l, r)].f == 1) //大于
    {
        if (num > tree[make_pair(l, r)].nbr) 
            return query(tree[make_pair(l, r)].ll, tree[make_pair(l, r)].lr, num);
        return query(tree[make_pair(l, r)].rl, tree[make_pair(l, r)].rr, num);
    } 
    if (tree[make_pair(l, r)].f == 2) //小于
    {
        if (num < tree[make_pair(l, r)].nbr) 
            return query(tree[make_pair(l, r)].ll, tree[make_pair(l, r)].lr, num);
        return query(tree[make_pair(l, r)].rl, tree[make_pair(l, r)].rr, num); 
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    //freopen("T3.in", "r", stdin);
    //freopen("T3.out", "w", stdout);
    cin >> m >> q >> s;
    int n = s.size();
    s = "#" + s;
    //匹配三目运算符
    for (int i = 1; i <= n; i++)
    {
        if (s[i] == '<' || s[i] == '>')
            stk1.push(i);
        if (s[i] == '?') //如果是?,入栈
        {
            int cur = stk1.top();
            mk1[cur] = i;
            stk1.pop();
            stk.push(i);
        }
        else if (s[i] == ':') //与最近的?匹配成一个三目运算符
        {
            int cur = stk.top();
            mark[cur] = i; //存下来
            stk.pop();
        }
    }
    //for (int i = 1; i <= n; i++) if (s[i] == '?') cout << i << " " << mark[i] << "\n";
    //cout << "\n" << s[118] << s[119] << s[120] << s[121] << s[122] << "\n\n";
    //for (int i = 1; i <= n; i++) if (s[i] == '<' || s[i] == '>') cout << i << " " << mk1[i] << " " << mark[mk1[i]] << "\n";
    //cout << "\n" << s[119] << s[120] << s[121];
    build(1, n); //建二叉树
    while (q--)
    {
        cin >> x;
        cout << query(1, n, x) << "\n";
    }
    return 0;
}
2024/10/14 20:14
加载中...