本文同步发表于 洛谷博客


初赛 Day -75

机构开始集训。和去年不同,在补知识点。

然后 CF 和 AT 都打了。

战绩还行。

反正还行就是了。

初赛 Day -1

把做的近 1010 套卷子对了下答案。最高有 70+70+ 的,也有 20+20+ 的。

不管怎样,重要的事情说三遍!!!\color{white}\texttt{重要的事情说三遍!!!}

CSPJ1/S1 2023 RP += + \operatorname{\Huge{CSP-J1/S1\ 2023\ RP\ +=\ +\infty\ }}

CSPJ1/S1 2023 RP += +  \operatorname{\Huge{CSP-J1/S1\ 2023\ RP\ +=\ +\infty\ }}

CSPJ1/S1 2023 RP += + \operatorname{\Huge{CSP-J1/S1\ 2023\ RP\ +=\ +\infty\ }}

明天据说在湖南大学考试,小小期待一下~

初赛

上午 J 组,还行。会的都会,不会的都不会

中午定了个钟点房在划水

下午 S 组,第一题就是一道 送分题\color{red}\Huge{\text{送分题}}。直接秒了。

然后后面的都还比较顺利。

出来 xtl 估分:

J:69.5

S:49.5

应该过了吧

晚上回机构打了 zr。

md sb zr。

直接开摆

第二天正常作息,下午模拟赛老师说放松一下,难度降低了。

最后 230 Pts。

CJ 老师叫我去上课,但学校有点事,周一先回了学校,处理后事。

同学们都祝我一路走好,会收好骨灰的。\color{white}\text{骨灰的。}我十分感谢他们。

复赛 Day -22

今天又是模拟赛。

但是,rk 2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

这里缺张图,晚点补

A:拓扑排序,然后没了

B:不会,然后打了暴力,然后暴力挂了

C:不会正解,写了个贪心,25 Pts。

然后突然发现 CJ 机子好快, 10810^8 乘常数本机 0.5s0.5\operatorname{s}

D:暴力+线段树。赛后发现有人 暴力+st 表过了,但大数据过不了。果断找老师加强数据。然后

(所有 7 结尾的分数都是被我 Hack 了的)

晚上和小学班主任进行了一个面的见,同时也愉快的一顿饭的吃。

然后之前不是骂 zr 吗,下一周的比赛就...

(230916 C 题大样例)

(还有题面)

然后之后就是训练、模拟赛了。没啥好说的。等复赛结束再说吧。

宣传一下个人主页 https://tbdsh.cnone.link、个人博客 https://blogtbdsh.cnone.link。如果出现了任何访问问题情况请看 说明

复赛 Day -11

看到发了初赛获奖分数线。

J 1=,S 2=。

复赛 Day -3

感谢 @yutong_Seafloor 的制作,以及 AI 的放大美化。

复赛 Day -1

把状压笔记写了下要不是快忘了我才不会写呢

复赛

预估分数

J 分数:

ydxy 数据 90+100+100+30=320 Pts90 + 100 + 100 + 30 = 320\ \text{Pts}

lg 数据 90+100+100+35=325 Pts90+100+100+35=325\ \text{Pts}

xtl 数据:90+40+100+35=265 Pts90+40+100+35=265\ \text{Pts}

jsk 数据:90+95+100+40=325 Pts90+95+100+40=325 \ \text{Pts}

mx 数据:90+95+100+40=325 Pts90+95+100+40=325\ \text{Pts}

htoj 数据:90+95+100+55=340 Pts90+95+100+55=340\ \text{Pts}


S 分数:

htoj 数据:100+25+15=140 Pts100+25+15=140\ \text{Pts}

ydxy 数据:100+25+15=140 Pts100+25+15=140\ \text{Pts}

lg 数据:100+25+15=140 Pts100+25+15=140\ \text{Pts}


赛后回忆

J 组

8:30 开题。

然后开了 1 个小时 A。

然后发现不会最后 1010 分。

果断放弃开 B。

B 半小时过。

然后开了 D。

看上去很像最短路板子。

10 分钟敲完,发现样例都过了。

然后就开 C 去了。

开始感觉很难,做着做着就感觉挺简单了。

然后发现过了。

截止 2023.10.21 22:04,所有数据只有 C 题都过了。

所以 C 应该稳了!!!!!!!!!!!!

中午开了个钟点房自测。

下午 S。

开题发现 A 数据好小,感觉不太对。

1 小时过 A。

然后写 C 去了。

写了 2.5 小时。

代码长这样:

#include<bits/stdc++.h>
#define int long long
#define f first
#define s second

using namespace std;
const int MAXN = 1e7 + 5;
using pii = pair<int, int>;
int cnt, last, cntStr, Str[105], Strsz[105];
pii nc[MAXN];
struct Node{
  string name1, name2;
};
vector<Node> a[105];
map<string, int> b;
vector<pair<int, string>> son[MAXN], bl;
void fp(int id, int fa){
  for (auto v : a[id]){
    string name1 = v.name1;
    string name2 = v.name2;
    
    if (name1 == "byte"){
      while (last % 1){
        last++;
      }
      nc[++cnt].f = last;
      son[fa].push_back({cnt, name2});
      nc[cnt].s = last;
      last++;
    }else if (name1 == "short"){
      while (last % 2){
        last++;
      }
      nc[++cnt].f = last;
      son[fa].push_back({cnt, name2});
      nc[cnt].s = last + 1;
      last += 2;
    }else if (name1 == "int"){
      while (last % 4){
        last++;
      }
      nc[++cnt].f = last;
      son[fa].push_back({cnt, name2});
      nc[cnt].s = last + 3;
      last += 4;
    }else if (name1 == "long"){
      while (last % 8){
        last++;
      }
      nc[++cnt].f = last;
      son[fa].push_back({cnt, name2});
      nc[cnt].s = last + 7;
      last += 8;
    }else {
      int tmp = Str[b[name1]];
      if (last % tmp == 0){
        nc[++cnt].f = last;
      }else {
        int Q = tmp - last % tmp;
        last += Q;
        nc[++cnt].f = last;
      }
      son[fa].push_back({cnt, name2});
      int Q = cnt;
      fp(b[name1], Q);
      nc[Q].s = last - 1;
    }
  }
}
int find(string s){
  string tmp;
  bool flag = 0;
  for (auto v : s){
    if (v == '.'){
      flag = 1;
      break;
    }
  }
  if (!flag){
    return nc[b[s]].f;
  }
  int id = 0;
  s.push_back('.');
  for (int i = 0; i < s.size(); i++){
    char v = s[i];
    if (v == '.'){
      if (i == s.size() - 1){
        for (auto v : son[id]){
          if (v.s == tmp){
            id = v.f;
            break;
          }
        }
        return nc[id].f;
      }else {
        if (!id){
          id = b[tmp];
          tmp = "";
          continue;
        }
        for (auto v : son[id]){
          if (v.s == tmp){
            id = v.f;
            break;
          }
        }
      }
      tmp = "";
      continue;
    }
    tmp.push_back(v);
  }
  return 0;
}
string ans;
bool ERR = 0;
void dfs(int x, int addr){
  bool f = 1;
  for (auto v : son[x]){
    if (nc[v.f].f <= addr && addr <= nc[v.f].s){
      f = 0;
      ans = ans + '.' + v.s;
      dfs(v.f, addr);
    }
  }
  if (f && son[x].size()){
    ans = "ERR";
    ERR = 1;
    return ;
  }else if (!son[x].size()){
    return ;
  } 
}
string findaddr(int addr){
  ans = "";
  ERR = 0;
  bool f = 1;
  for (auto v : bl){
    if (nc[v.f].f <= addr && addr <= nc[v.f].s){
      ans = ans + v.s;
      dfs(v.f, addr);
      f = 0;
      break;
    }
  }
  if (f){
    return "ERR";
  }
  return ans;
}
signed main(){
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("struct.in", "r", stdin);
  freopen("struct.out", "w", stdout);
  int n;
  cin >> n;
  while (n--){
    int op;
    cin >> op;
    if (op == 1){
      string s;
      int k;
      cin >> s >> k;
      b[s] = ++cntStr;
      int fa = cntStr, maxx = -1;
      int bg = 0;
      while (k--){
        string name1, name2;
        cin >> name1 >> name2;
        a[fa].push_back(Node{name1, name2});
        if (name1 == "byte"){
          maxx = max(maxx, 1ll);
          while (bg % 1){
            bg++;
          }
          bg++;
        }else if (name1 == "short"){
          maxx = max(maxx, 2ll);
          while (bg % 2){
            bg++;
          }
          bg += 2;
        }else if (name1 == "int"){
          maxx = max(maxx, 4ll);
          while (bg % 4){
            bg++;
          }
          bg += 4;
        }else if (name1 == "long"){
          maxx = max(maxx, 8ll);
          while (bg % 8){
            bg++;
          }
          bg += 8;
        }else {
          int tmp = Strsz[b[name1]];
          while (bg % tmp){
            bg++;
          }
          bg += tmp;
          maxx = max(maxx, tmp);
        }
      }
      while (bg % maxx){
        bg++;
      }
      Str[fa] = maxx;
      Strsz[fa] = maxx;
      cout << bg << ' ' << maxx << '\n';
    }else if (op == 2){
      string t, name2;
      cin >> t >> name2;
      bl.push_back({cnt + 1, name2});
      b[name2] = cnt + 1;
      if (t == "byte"){
        while (last % 1){
          last++;
        }
        nc[++cnt].f = last;
        nc[cnt].s = last;
        last++;
      }else if (t == "short"){
        while (last % 2){
          last++;
        }
        nc[++cnt].f = last;
        nc[cnt].s = last + 1;
        last += 2;
      }else if (t == "int"){
        while (last % 4){
          last++;
        }
        nc[++cnt].f = last;
        nc[cnt].s = last + 3;
        last += 4;
      }else if (t == "long"){
        while (last % 8){
          last++;
        }
        nc[++cnt].f = last;
        nc[cnt].s = last + 7;
        last += 8;
      }else {
        int tmp = Str[b[t]];
        if (last % tmp == 0){
          nc[++cnt].f = last;
        }else {
          last += tmp - last % tmp;
          nc[++cnt].f = last;
        }
        int fa = cnt;
        fp(b[t], fa);
        nc[fa].s = last - 1;
      }
      cout << nc[cnt].f << '\n';
    }else if (op == 3){
      string s;
      cin >> s;
      cout << find(s) << '\n';
    }else {
      int addr;
      cin >> addr;
      cout << findaddr(addr) << '\n';
    }
  }
  return 0;
}

然后 15 分。

最后把 B 写了,25 分。

坐标 HN,希望能有 1=。。。

想打 NOIP。。。

QwQ。。。