本文同步发表于 洛谷博客
初赛 Day -75
机构开始集训。和去年不同,在补知识点。
然后 CF 和 AT 都打了。
战绩还行。
反正还行就是了。
初赛 Day -1
把做的近 套卷子对了下答案。最高有 的,也有 的。
不管怎样,
明天据说在湖南大学考试,小小期待一下~
初赛
上午 J 组,还行。会的都会,不会的都不会。
中午定了个钟点房在划水。
下午 S 组,第一题就是一道 。直接秒了。
然后后面的都还比较顺利。
出来 xtl 估分:
J:69.5
S:49.5
应该过了吧
晚上回机构打了 zr。
md sb zr。
直接开摆
第二天正常作息,下午模拟赛老师说放松一下,难度降低了。
最后 230 Pts。
CJ 老师叫我去上课,但学校有点事,周一先回了学校,处理后事。
同学们都祝我一路走好,会收好我十分感谢他们。
复赛 Day -22
今天又是模拟赛。
但是,rk 2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这里缺张图,晚点补
A:拓扑排序,然后没了
B:不会,然后打了暴力,然后暴力挂了
C:不会正解,写了个贪心,25 Pts。
然后突然发现 CJ 机子好快, 乘常数本机 。
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 数据 。
lg 数据 。
xtl 数据:。
jsk 数据:。
mx 数据:
htoj 数据:
S 分数:
htoj 数据:。
ydxy 数据:。
lg 数据:。
赛后回忆
J 组
8:30 开题。
然后开了 1 个小时 A。
然后发现不会最后 分。
果断放弃开 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。。。