65 pts TLE 求调
查看原帖
65 pts TLE 求调
765847
lovely_codingcow楼主2023/11/7 20:29

RT

#include <iostream>
#include <unordered_map>
#include <vector>

using namespace std;

int n, op, k, siz, nowaddr;
string typ, nam, strnam;
// type, size
unordered_map<string, int> sz, pagesz;
// type, an array of members (type, name)
unordered_map<string, vector<pair<string, string> > > structs;
// start addr of elements
unordered_map<string, int> staddr;
// elements (name, type)
vector<pair<string, string> > elements;

bool is_basic_type(string typ) {
    return typ == "byte" || typ == "short" || typ == "int" || typ == "long";
}

int getaddr(string typnam, int addr) {
    int typsz = pagesz[typnam];
    if (addr % typsz) {
        if (addr < typsz) {
            addr = typsz;
        } else {
            addr += typsz - (addr % typsz);
        }
    }
    return addr;
}

int getaddr(int typsz, int addr) {
    if (addr % typsz) {
        if (addr < typsz) {
            addr = typsz;
        } else {
            addr += typsz - (addr % typsz);
        }
    }
    return addr;
}

void new_element(string typ, string nam) {
    nowaddr = getaddr(typ, nowaddr);
//	cout << typ << " " << nam << " " << nowaddr << endl;
    staddr[nam] = nowaddr;
    if (is_basic_type(typ)) {
        nowaddr += sz[typ];
        elements.push_back({typ, nam});
    } else {
        for (auto i : structs[typ]) {
            new_element(i.first, nam + '.' + i.second);
        }
    }
    nowaddr = staddr[nam] + sz[typ];
}

signed main() {
    // freopen("struct.in", "rt", stdin);
    // freopen("struct.out", "wt", stdout);
    sz["byte"] = pagesz["byte"] = 1;
    sz["short"] = pagesz["short"] = 2;
    sz["int"] = pagesz["int"] = 4;
    sz["long"] = pagesz["long"] = 8;
    cin >> n;
    while (n--) {
        cin >> op;
        switch (op) {
            case (1): {
                cin >> strnam >> k;
                vector<pair<string, string> > v;
                for (int i = 1; i <= k; i++) {
                    cin >> typ >> nam;
                    sz[strnam] = getaddr(typ, sz[strnam]) + sz[typ];
                    pagesz[strnam] = max(pagesz[strnam], pagesz[typ]);
                    v.push_back({typ, nam});
                }
                structs[strnam] = v;
                sz[strnam] = getaddr(pagesz[strnam], sz[strnam]);
                cout << sz[strnam] << " " << pagesz[strnam] << endl;
                break;
            }
            case (2): {
                cin >> typ >> nam;
                cout << getaddr(typ, nowaddr) << endl;
                new_element(typ, nam);
                break;
            }
            case (3): {
                cin >> nam;
                cout << staddr[nam] << endl;
                break;
            }
            case (4): {
                cin >> k;
                bool p = true;
                for (auto i : elements) {
                    if (staddr[i.second] <= k && staddr[i.second] + sz[i.first] > k) {
                        cout << i.second << endl;
                        p = false;
                        break;
                    }
                }
                if (p) {
                    cout << "ERR\n";
                }
                break;
            }
        }
    }
}
2023/11/7 20:29
加载中...