csp-s第三题75fen求调
  • 板块学术版
  • 楼主nodick
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/22 10:58
  • 上次更新2023/11/2 11:58:27
查看原帖
csp-s第三题75fen求调
753534
nodick楼主2023/10/22 10:58
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n,op,k,addr;
string s,t,m,ans;
unordered_map<string,LL> room,tab;
unordered_map<string,string> type;
unordered_map<string,vector<pair<string,string> > > member;
vector<string> vec,vis;
LL getadd(LL f,string g,LL h)
{
    if(f==(int)vis.size()) return h+(h%tab[g]?tab[g]-(h%tab[g]):0);
    string pre;
    for(int i=0;i<(int)member[g].size();i++)
    {
        if(member[g][i].first!=vis[f])
        {
            string p=member[g][i].second;
            if(h%tab[p]) h+=tab[p]-(h%tab[p]);
            h+=room[p];
        }
        else 
        {
            pre=member[g][i].second;
            break;
        }
    }
    h=getadd(f+1,pre,h);
    return h;
}
LL getting(string g,LL h)
{
    LL cnt=h,c=0;
    string pre;
    for(int i=0;i<=(int)member[g].size();i++)
        if(cnt<=k)
        {
            if(i==(int)member[g].size()) {c=1;break;}
            string p=member[g][i].second;
            if(cnt%tab[p]) cnt+=tab[p]-(cnt%tab[p]);
            if(cnt>k) {c=1;break;}
            cnt+=room[p];
            if(cnt>k&&(p=="byte"||p=="int"||p=="short"||p=="long")) 
			{
				ans+="."+member[g][i].first;
			    return 1;
			}
            if(cnt>k)
            {
                cnt-=room[p],pre=member[g][i].second;
                ans+="."+member[g][i].first;
                break;
            }
        }
    if(c==1) return -1;
    cnt=getting(pre,cnt);
    return cnt;
}
int main()
{
    //freopen("struct.in","r",stdin);
    //freopen("struct.out","w",stdout);
    cin>>n;
    room["byte"]=1,tab["byte"]=1;
    room["short"]=2,tab["short"]=2;
    room["int"]=4,tab["int"]=4;
    room["long"]=8,tab["long"]=8;
    while(n--)
    {
        cin>>op;
        if(op==1)
        {
            cin>>s>>k;
            LL space=0,delta=0;
            for(int i=1;i<=k;i++)
            {
                cin>>t>>m;
                member[s].push_back(make_pair(m,t));
                if(space%tab[t]) space+=tab[t]-(space%tab[t]);
                space+=room[t];
                delta=max(delta,tab[t]);
            }
            if(space%delta) space+=delta-(space%delta);
            room[s]=space,tab[s]=delta;
            cout<<space<<' '<<delta<<'\n';
        }
        else if(op==2)
        {
            cin>>t>>m;
            type[m]=t;
            vec.push_back(m);
            if(addr%tab[t]) addr+=tab[t]-(addr%tab[t]);
            cout<<addr<<'\n';
            addr+=room[t];
        }
        else if(op==3)
        {
            while(!vis.empty()) vis.pop_back();
            cin>>s;
            string pre="";
            for(int i=0;i<(int)s.size();i++)
                if(s[i]=='.') vis.push_back(pre),pre="";
                else pre+=s[i];
            vis.push_back(pre),pre="";
            LL cnt=0;
            
            for(int i=0;i<(int)vec.size();i++)
                if(vec[i]!=vis[0])
                {
                    string p=type[vec[i]];
                    if(cnt%tab[p]) cnt+=tab[p]-(cnt%tab[p]);
                    cnt+=room[p];
                }
                else 
                {
                    pre=type[vec[i]];
                    break;
                }
            cnt=getadd(1,pre,cnt);
            cout<<cnt<<'\n';
        }
        else if(op==4)
        {
            cin>>k;
            LL cnt=0,c=0;
            string pre;
            ans="";
            for(int i=0;i<=(int)vec.size();i++)
                if(cnt<=k)
                {
                    if(i==(int)vec.size()) {c=1;break;}
                    string p=type[vec[i]];
                    if(cnt%tab[p]) cnt+=tab[p]-(cnt%tab[p]);
                    if(cnt>k) {c=1;break;}
                    cnt+=room[p];
                    if(cnt>k&&(p=="byte"||p=="int"||p=="short"||p=="long"))
                    {
                        cnt=-2;
                        ans+=vec[i];
                        break;
                    }
                    if(cnt>k)
                    {
                        cnt-=room[p],pre=type[vec[i]];
                        ans+=vec[i];
                        break;
                    }
                }
            if(c==1) cnt=-1;
            else if(cnt!=-2) cnt=getting(pre,cnt);
            if(cnt==-1) cout<<"ERR"<<'\n';
            else cout<<ans<<'\n';
        }
    }
    return 0;
}
2023/10/22 10:58
加载中...