CSP-S 2023 游记

发布时间 2023-10-23 17:27:56作者: Rainbow_qwq

比赛没什么好说的,就不写了。看起来没挂分的样子。


但是赛后教练要求造民间数据,运气很差抽奖抽到了大模拟 T3 /fn

最终生成方式是:

  • 1 操作从小于等于 x 的宽度的类型中随机抽,大于 1e18 就不加进去
  • 3,4 操作都是随机一个位置

然而写起来就很 shit 了,比考场代码 ex 了 114514 倍。总之鸽到第二天中午才写完。

放个 gen 在这里,希望没锅

// what is matter? never mind. 
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2") 
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
#define int long long
using namespace std;
inline int read()
{
    char c=getchar();int x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;return x;
}

#define fi first
#define se second
#define pb push_back
#define mkp make_pair
typedef pair<int,int>pii;
typedef vector<int>vi;
 
#define maxn 200005
#define inf 0x3f3f3f3f

mt19937_64 rnd(time(0));
int V=1e18;
int nxt(int x,int d){
	if(x%d==0)return x;
	return x-x%d+d;
}

int R(int l,int r){
	assert(l<=r);
	return rnd()%(r-l+1)+l;
}

int siz[maxn],D[maxn];

string Name[maxn];
set<string>S;
string genstr(){
	int len=R(7,10);
	string s;
	s.resize(len);
	int l=(int)('a'),r=(int)('z');
	while(1){
		For(i,0,len-1) s[i]=R(l,r);
		if(!S.count(s)){
			S.insert(s);
			return s;
		}
	}
}

struct node{
	string name;
	vector<int>ch;
	vector<string>nam;
	vector<pii>pos;
	void calc(int u){
		int n=ch.size();
		shuffle(ch.begin(),ch.end(),rnd);
		assert(n>0);
		nam.resize(n);
		pos.resize(n);
		name=genstr();
		Name[u]=name;
		for(auto&x:nam)x=genstr();
		D[u]=0;
		For(i,0,n-1){
			int x=ch[i];
			D[u]=max(D[u],D[x]);
			if(i==0)pos[i].fi=0;
			else pos[i].fi=nxt(pos[i-1].se,D[x]);
			pos[i].se=pos[i].fi+siz[x];
		}
		siz[u]=nxt(pos.back().se,D[u]);
		cout<<"1 "<<name<<" "<<n<<"\n";
		For(i,0,n-1)cout<<Name[ch[i]]<<" "<<nam[i]<<"\n";
	}
}t[1145];

int n,m;
vector<int>vec[1145];
int lg[666];

bool ODD=0;

void gen(int i){
	if(ODD)i=4;
	int u=++m;
	int cnt=R(50,100);
	int now=0;
	while(cnt--){
		int j=rnd()%i+1;
		if(ODD || !now)j=i;
//		j=i;
		int x=vec[j][rnd()%vec[j].size()];
//		x=vec[j][0];
		now+=siz[x]+8;
		if(now>V){
			now-=siz[x]+8;
			continue;
		}
		t[u].ch.pb(x);
	}
	t[u].calc(u);
	cerr<<"siz "<<u<<" "<<t[u].ch.size()<<" "<<siz[u]<<" "<<D[u]<<"\n";
	For(j,lg[D[u]],lg[D[u]]) vec[j].pb(u);
//	exit(0);
}

int sumlen=0,len,id[maxn];
string str[maxn];

signed main()
{
	freopen("20.in","w",stdout);
	ODD=0;
	lg[1]=1;
	lg[2]=2;
	lg[4]=3;
	lg[8]=4;
	S.insert("int"),S.insert("short"),S.insert("byte"),S.insert("long");
	m=4;
	For(i,1,4){
		siz[i]=D[i]=1<<(i-1);
		if(i==1) Name[i]=t[i].name="byte";
		if(i==2) Name[i]=t[i].name="short";
		if(i==3) Name[i]=t[i].name="int";
		if(i==4) Name[i]=t[i].name="long";
		For(j,i,i){
			vec[j].pb(i);
		}
	}
	int T=100;
	int no1=0;
	cout<<T<<"\n";
	For(i,1,T){
		int opt=rnd()%5;
		if(!no1 && (opt>=3 || (opt==1 && !len))){
			gen(rnd()%4+1);
	//		no1=1;
			continue;
		}
		if(opt==2 || (opt==1 && !len)){
			int x=R(1,m);
			if(ODD) x=R(4,m);
			++len;
			str[len]=genstr();
			id[len]=x;
			cout<<2<<" "<<Name[x]<<" "<<str[len]<<"\n";
			sumlen+=x;
			continue;
		}
		if(opt==1 && len){
			int u=rnd()%len+1;
			string out=str[u];
			u=id[u];
			while(1){
				if(rnd()%10==0 || u<=4)break;
				out+='.';
				int xx=rnd()%siz[u];
				int x=0;
				while(x+1<t[u].ch.size() && t[u].pos[x+1].fi<=xx)++x;
				out+=t[u].nam[x];
				cerr<<"u: "<<u<<" "<<t[u].ch[x]<<"\n";
				u=t[u].ch[x];
			}
			cout<<3<<" "<<out<<"\n";
			continue;
		}
		if(1){
			cout<<4<<" "<<R(1,sumlen+1)<<"\n";
		}
	}
	return 0;
}
/*
3 3
4 5
5 8
6 13
7 20
8 31
9 46
10 68
11 98
12 140
13 196
14 271
15 372
16 507
17 683
18 914
19 1211
20 1596
21 2086
22 2702
23 3483
24 4481
25 5735
26 7305
27 9255
28 11690
29 14698
30 18398
31 22956
32 28377
33 35142
34 43435
35 53544
36 65844
37 80681
38 98465
39 120027
40 146014
41 177156
42 214296
43 258795
44 310839
45 373222
46 447565
47 535652
48 640623
49 765073
50 911399
51 1083643
52 1286364
53 1525369
54 1805449
55 2134485
56 2517935
57 2963610
58 3469917
59 4070339
60 4776068
61 5600651
62 6548931
63 7656701
64 8943838
65 10418648
66 12116546
67 14085429
68 16327795
69 18939854
70 21946828
71 25403398
72 29346826
73 33857324
74 38886753
75 44701017
76 51379898
77 58972243
78 67627297
79 77410577
80 88403440
81 100897890
82 114832336
83 130370982
84 147887675
85 167518487
86 188919368
87 212938641
88 239286686
89 268361618
90 299682510
91 333589384
92 369081895
93 406972043
94 447554008
95 490508353
96 535139454
97 580944459
98 627160545
99 673511162
100 718800964
101 762523551
102 803059376
103 841096330
104 874812575
105 904279688
106 929344521
107 948632660
108 964511947
109 976767910
110 985570132
111 991559710
112 995292156
113 997578918
114 998838827
115 999500788
116 999805701
117 999932623
118 999979235
119 999994383
120 999998659
121 999999756
122 999999964
123 1000000001
124 1000000006
*/