【~⭐Super 大模拟 time⭐~】题解:AT_birthday0410_x
RainRecall · · 题解
upd on 2025.6.25 重写了一些内容,增加了卡常的历程。
截止 2025.6.25,此题解为全 Atcoder 的最优解,以
前言
作为一道黑题大模拟,AT_birthday0410_x 一直以其抽象的题面而在大模拟界闻名。
今天,我终于做出了这道题。
—— 2024.02.18 至 2024.07.16。
思路
写这种复杂的大模拟,可以把题拆成很多个部分实现。
首先当然是要明确思路,思路就是先降噪,然后把字符分离下来,然后生成很多张图片,比对出来最相似的图片,最后表达式求值就行。
实现中可以写一个结构体来存(原谅我太菜了不会类)。
降噪
这部分并不是很难,可以采用“众数滤波器”,即判断一个位置周围(包括自己)的 # 的个数和 . 的个数哪个大,从而得到这个位置应该填什么。
分离字符
这个也不难,直接写个搜索就行了,注意边界的问题。
生成图片
这个是最关键的一步。
我们得到初始的图片,然后按照题目中的变换方式生成参数,变换即可。
生成参数大部分题解用的都是随机,但可以采用直接一点一点枚举参数的方式。有一种想法是用多层循环枚举参数,但是这不是很快。考虑单层循环,每次有的参数加、有的参数减,这样也能生成效果差不多的图片。但是这个东西很玄学,经过我的多次测试,测出了最优的一种枚举方式:
shrink(qwq,dr(M.fi,M.se,k),rd(Mx.fi,Mx.se,k),rd(My.fi,My.se,k));
rotate(qwq,rd(R.fi,R.se,k));
distortion(qwq,dr(Sx.fi,Sx.se,k),rd(Sy.fi,Sy.se,k));
其中 rd 函数为正着枚举,dr 函数为倒着枚举。
这个东西优到什么程度,你等会就知道了。
当然,你还需要写一个使图像居中的函数,时常调用一下,可以使图像更准确一些。
比较
其实可以拆成
或者你把每列
确定你在比较前的两个图像是居中的。
表达式求值
这里用的是递归写法,因为我不会栈的方法,但是无所谓了。
后记
你会发现写完之后洛谷交不上去,所以考虑把初始的表也压成二进制位,这样总代码只有
这样我们就通过了这道题,但是跑的并不是很快。
最优解之战
刚开始程序跑了
但是那时候的测试次数是
这样就快多了,我们加点读入优化就来到了
我采用在代码中间插入 return 0; 的方式找到了问题,是我们一直以为的复杂度瓶颈错了。我的代码有这样几个主要部分:
-
降噪
-
搜索每个连通块
-
生成图片
-
判断
-
表达式求值
其中判断和生成图片经过优化已经很快了,表达式求值也是几乎没有时间消耗的,所以我认为是搜索连通块的常数太大了,但其实并非如此。搜索连通块只占了
所以我们尝试优化降噪,我们在其中加上判断:
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int b=0,w=0;
for(int k=0;k<9;++k){
int x=i+v[k][0],y=j+v[k][1];
if(x>=1&&x<=n&&y>=1&&y<=m){
if(syx[x][y]=='#')++b;
else ++w;
if(b>4||w>4)break;//这里加了个常数优化
}
}
if(b>w)a[i][j]='#';
else a[i][j]='.';
}
}
那我们就卡到了
#include<bits/stdc++.h>
#ifdef __linux__
#define _getchar_nolock getchar_unlocked
#define _putchar_nolock putchar_unlocked
#endif
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
using namespace std;
long long zc[105][105]={{0ll,0ll,0ll,0ll,0ll,0ll,0ll,8355840ll,33546240ll,134215680ll,268434432ll,536870400ll,1073741568ll,2147483520ll,2145517440ll,4286611392ll,4278206400ll,8573173728ll,8556388320ll,8556388320ll,8556388320ll,17112764400ll,17112764400ll,17112764400ll,17112764400ll,17112764400ll,17112764400ll,17112764400ll,17112764400ll,17112764400ll,17112764400ll,17112764400ll,8556388320ll,8556388320ll,8556388320ll,8573173728ll,4278206400ll,4286611392ll,2145517440ll,2147483520ll,1073741568ll,536870400ll,268434432ll,134215680ll,33546240ll,8355840ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,7864320ll,16646144ll,16760832ll,16775168ll,16776960ll,16777088ll,16777088ll,16777088ll,16777088ll,16727808ll,16713472ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,16711680ll,8589934464ll,8589934528ll,8589934528ll,8589934528ll,8589934528ll,8589934464ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,8372224ll,33552384ll,134217472ll,268435328ll,536870848ll,536870848ll,1073741760ll,1071677376ll,2143297472ll,2139103168ll,2139103168ll,2139103168ll,2139103168ll,2139103104ll,2143289344ll,1069547520ll,1071644672ll,1072693248ll,536346624ll,536608768ll,268304384ll,134152192ll,67076096ll,33538048ll,16769024ll,8384512ll,4164941824ll,8524921856ll,8523873792ll,8523349760ll,8523087744ll,8522956736ll,8589934560ll,8589934560ll,8589934560ll,8589934560ll,8589934560ll,8589934528ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,16760832ll,67107840ll,268435200ll,536870784ll,1073741696ll,2147483520ll,2147483520ll,4290805632ll,4286594944ll,4278206336ll,4278206336ll,4278206208ll,4278190080ll,4278190080ll,2139095040ll,2143289344ll,1073709056ll,536854528ll,268419072ll,536854528ll,1073725440ll,2147450880ll,4290772992ll,4278190080ll,8573157376ll,8556380160ll,8556380160ll,8556380160ll,8556380160ll,8573157376ll,8581546880ll,4290789312ll,4294967232ll,2147483584ll,2147483616ll,1073741760ll,268435392ll,67108352ll,8384512ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,65011712ll,133169152ll,133693440ll,133955584ll,134086656ll,134152192ll,134152192ll,134184960ll,134201344ll,134209536ll,134213632ll,134215680ll,133691392ll,133430272ll,133299712ll,133234432ll,133234560ll,133201792ll,133185472ll,133177312ll,17179869168ll,17179869168ll,17179869168ll,17179869168ll,17179869168ll,17179869168ll,133693440ll,133693440ll,133693440ll,133693440ll,133693440ll,133693440ll,8589926400ll,8589930496ll,8589930496ll,8589930496ll,8589930496ll,8589926400ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,1073741568ll,2147483392ll,2147483392ll,2147483392ll,2147483392ll,1073741568ll,32512ll,32512ll,32512ll,32512ll,32512ll,32512ll,33456000ll,134217600ll,536870784ll,1073741696ll,2147483520ll,2147483520ll,4294967168ll,4290805632ll,4286581760ll,8573157376ll,8556380160ll,8556380160ll,8556380160ll,8556380160ll,8556380160ll,8556380160ll,8573157632ll,4286580608ll,4292886464ll,4294967232ll,2147483584ll,1073741792ll,536870848ll,268435328ll,67108352ll,8380416ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,2113929216ll,2146435072ll,4294836224ll,4294934528ll,4294959104ll,4294963200ll,2147481600ll,67107840ll,2096640ll,524032ll,130816ll,65408ll,32640ll,16320ll,16320ll,33431488ll,268410816ll,1073741792ll,2147483616ll,4294967264ll,4294967264ll,8581677024ll,8573190112ll,17146331104ll,17112768480ll,17112768480ll,17112768480ll,17112768448ll,17112768448ll,17146331072ll,8573190080ll,8585871232ll,8589934336ll,4294967040ll,2147483136ll,1073740800ll,536868864ll,134209536ll,16711680ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,8589934528ll,17179869120ll,17179869120ll,17179869120ll,17179869120ll,8589934528ll,8573165504ll,8573165504ll,4286586816ll,4286586816ll,2139103168ll,2143297472ll,1069555648ll,1071652800ll,1071648640ll,534773760ll,535822336ll,267386880ll,267911168ll,133693440ll,133955584ll,133955584ll,66846720ll,66977792ll,33423360ll,33488896ll,16711680ll,16711680ll,8355840ll,8355840ll,8372224ll,4177920ll,4177920ll,2088960ll,2088960ll,1040384ll,1040384ll,1015808ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,16744448ll,67100672ll,268433408ll,536869888ll,1073741312ll,2147483392ll,2147483392ll,2143420160ll,4286644096ll,4278222720ll,4278222720ll,4278222720ll,4278222720ll,4278222720ll,2139160320ll,2143420160ll,1073741312ll,536869888ll,268433408ll,268433408ll,1073741312ll,2147483392ll,4290838400ll,4278206400ll,8573173696ll,8556388320ll,8556388320ll,8556388320ll,8556388320ll,8573173728ll,8573173728ll,4290838464ll,4294967232ll,2147483520ll,2147483520ll,1073741568ll,536870400ll,134215680ll,16760832ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,8372224ll,33550336ll,134216704ll,268434944ll,536870656ll,1073741696ll,1073741760ll,2143354816ll,4286611392ll,4278206432ll,4261421024ll,4261421024ll,8556388320ll,8556388320ll,8556388320ll,8573173728ll,8581562304ll,8585805760ll,8589934464ll,8589934464ll,8589934336ll,8589934080ll,8564766720ll,4263501824ll,4261412864ll,4278190080ll,4278190080ll,2139095040ll,2143289344ll,1072693248ll,1073479680ll,536854528ll,268434944ll,134217472ll,67108608ll,16776960ll,4194048ll,1048320ll,32256ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,125829120ll,264241152ll,267386880ll,536346624ll,536608768ll,536739840ll,268369920ll,67076096ll,33538048ll,16769024ll,8380416ll,4190208ll,2093056ll,1046528ll,522240ll,523264ll,261120ll,261632ll,130560ll,130560ll,130560ll,130816ll,65280ll,65280ll,65280ll,65280ll,65280ll,65280ll,65280ll,65280ll,65280ll,65280ll,130560ll,130560ll,130560ll,261632ll,261120ll,523264ll,523264ll,1046528ll,2095104ll,2093056ll,4186112ll,8380416ll,33538048ll,67076096ll,134152192ll,536739840ll,536608768ll,536346624ll,535822336ll,266338304ll,125829120ll,33554432ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,30720ll,64512ll,261632ll,523776ll,1048064ll,2096640ll,4193280ll,8384512ll,16769024ll,16760832ll,33521664ll,67043328ll,66977792ll,133955584ll,133693440ll,267911168ll,267386880ll,535822336ll,534773760ll,534773760ll,534773760ll,1071644672ll,1069547520ll,1069547520ll,1069547520ll,1069547520ll,1069547520ll,1069547520ll,1069547520ll,1069547520ll,1069547520ll,1069547520ll,534773760ll,534773760ll,534773760ll,535822336ll,267386880ll,267911168ll,267911168ll,133955584ll,134086656ll,67043328ll,33488896ll,33538048ll,16769024ll,8384512ll,4192256ll,2096640ll,1048064ll,523776ll,261632ll,130048ll,30720ll,4096ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,4063232ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8589934528ll,8589934528ll,8589934528ll,8589934528ll,8589934528ll,8589934528ll,8589934528ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,8323072ll,4063232ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,4294967232ll,8589934560ll,8589934560ll,8589934560ll,8589934560ll,8589934560ll,8589934528ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,0ll,0ll,0ll,0ll,1966080ll,4128768ll,8323072ll,8355840ll,8355840ll,8323072ll,4128768ll,2017398656ll,4265549696ll,4290674624ll,4292870080ll,4294967232ll,4294967232ll,2147483520ll,67104768ll,8355840ll,33538048ll,67100672ll,133691392ll,267648000ll,536083456ll,534904320ll,534904320ll,532806656ll,264304640ll,50360320ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,},
{0ll,0ll,0ll,2013265920ll,8455716864ll,8522825728ll,8522825728ll,8556380160ll,4261412864ll,4278190080ll,2130706432ll,2139095040ll,1065353216ll,1069547520ll,532676608ll,534773760ll,534773760ll,266338304ll,267386880ll,133169152ll,133693440ll,66584576ll,66846720ll,33292288ll,33423360ll,16646144ll,16711680ll,8323072ll,8355840ll,4161536ll,4161536ll,4177920ll,2080768ll,2088960ll,1040384ll,1044480ll,520192ll,522240ll,260096ll,261120ll,130048ll,130560ll,65024ll,65280ll,65280ll,32512ll,32640ll,16256ll,16320ll,8128ll,8160ll,4064ll,4032ll,3968ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,0ll,}};
string c[105][105];
#define fi first
#define se second
#define N 5
int t,v[9][2]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
int vis[70][9005],n,m,nxt[1005],testtime;
char a[70][9005],syx[70][9005],zzy[70][9005];
double rd(double x,double y,int k){
return x+(y-x)*(k-1)/(testtime-1);
}
double dr(double x,double y,double k){
return y-(y-x)*(k-1)/(testtime-1);
}
struct image{
int n,m;
char a[100][100];
void dfs(int x,int y,int &minx,int &miny,int &maxx,int &maxy,int &siz){
minx=min(minx,x);maxx=max(maxx,x);
miny=min(miny,y);maxy=max(maxy,y);++siz;
for(int i=1;i<=4;++i){
int px=x+v[i][0],py=y+v[i][1];
if(px>=1&&px<=n&&py>=1&&py<=m&&a[px][py]=='#'&&!vis[px][py]){
vis[px][py]=1;dfs(px,py,minx,miny,maxx,maxy,siz);
}
}
}
image(){
n=m=0;
for(int i=1;i<=65;++i){
for(int j=1;j<=38;++j)a[i][j]='.';
}
}
image(int x,int y){
n=x;m=y;
for(int i=1;i<=65;++i){
for(int j=1;j<=38;++j)a[i][j]='.';
}
}
void clean(){
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)a[i][j]='.';
}
}
bool hefa(int x,int y){
return x>=1&&x<=n&&y>=1&&y<=m;
}
void print(){
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)cout<<a[i][j];cout<<'\n';
}
}
void clear(image &b){
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int b=0,w=0;
for(int k=0;k<9;++k){
int x=i+v[k][0],y=j+v[k][1];
if(hefa(x,y)){
if(a[x][y]=='#')++b;
else ++w;
}
}
if(b>w)zzy[i][j]='#';
else zzy[i][j]='.';
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)b.a[i][j]=zzy[i][j];
}
}
}qwqset[20],rqwq(65,38),dqwq(65,38),sqwq(65,38);
string lx,ovo=" 0123456789()+-*/";
unsigned long long dinnerl[20][N][70],yhbl[205][70],yhbsize;
void middle(image &a){
for(int i=1;i<=65;++i){
for(int j=1;j<=38;++j)zzy[i][j]='.';
}
int sx=0,sy=0,cnt=0;
for(int i=1;i<=a.n;++i){
for(int j=1;j<=a.m;++j){
if(a.a[i][j]=='#')sx+=i,sy+=j,++cnt;
}
}
int px=32-(sx*2+cnt)*1.0/(cnt*2),py=19-(sy*2+cnt)*1.0/(cnt*2);
for(int i=1;i<=a.n;++i){
for(int j=1;j<=a.m;++j){
int x=i+px,y=j+py;
if(x>=1&&x<=65&&y>=1&&y<=38)zzy[x][y]=a.a[i][j];
}
}
a.n=65,a.m=38;
for(int i=1;i<=65;++i){
for(int j=1;j<=38;++j)a.a[i][j]=zzy[i][j];
}
}
inline void rotate(image &b,double R){
double pi=3.1415926,x=32.5,y=19;
R=pi/180*R;
int px,py;
rqwq.clean();
for(int i=1;i<=65;++i){
for(int j=1;j<=38;++j){
if(b.a[i][j]=='#'){
px=round(1.0*(i-x)*cos(R)-(j-y)*sin(R)+x);
py=round(1.0*(i-x)*sin(R)+(j-y)*cos(R)+y);
if(px>=1&&px<=65&&py>=1&&py<=38)rqwq.a[px][py]='#';
}
}
}
middle(rqwq);rqwq.clear(rqwq);
b=rqwq;
}
void distortion(image &b,double SX,double SY){
dqwq.clean();
int px,py;
for(int i=1;i<=65;++i){
for(int j=1;j<=38;++j){
px=round(i*1.0+SY*j),py=round(SX*i+1.0*j);
if(px>=1&&px<=65&&py>=1&&py<=38)dqwq.a[px][py]=b.a[i][j];
}
}
middle(dqwq);dqwq.clear(dqwq);
b=dqwq;
}
void shrink(image &b,double M,double MX,double MY){
sqwq.clean();
for(int i=1;i<=65;++i){
for(int j=1;j<=38;++j)sqwq.a[(int)round(i*M*MX)][(int)round(j*M*MY)]=b.a[i][j];
}
sqwq.n*=M*MX;sqwq.m*=M*MY;
middle(sqwq);sqwq.clear(sqwq);
b=sqwq;
}
inline void dfs(int x,int y,int &minx,int &miny,int &maxx,int &maxy,int &siz){
minx=min(minx,x);maxx=max(maxx,x);
miny=min(miny,y);maxy=max(maxy,y);++siz;
for(int i=1;i<=4;++i){
int px=x+v[i][0],py=y+v[i][1];
if(px>=1&&px<=n&&py>=1&&py<=m&&a[px][py]=='#'&&!vis[px][py]){
vis[px][py]=1;dfs(px,py,minx,miny,maxx,maxy,siz);
}
}
}
void train(){
pair<double,double>M,Mx,My,R,Sx,Sy;
testtime=2;
if(0<=t&&t<30){
M=Mx=My={0.9,1};R={-3,3};Sx=Sy={0,0};
}
else if(30<=t&&t<90){
M=Mx=My={0.9,1};R={-10,10};Sx=Sy={-0.1,0.1};
}
else{
M=Mx=My={0.9,1};R={-15,15};Sx=Sy={-0.1,0.1};
}
image qwq(65,38);
for(int i=1;i<=16;++i){
for(int j=1;j<=65;++j){
for(int k=1;k<=38;++k){
qwq.a[j][k]=c[i][j][k];
}
}
middle(qwq);
qwqset[i]=qwq;
}
for(int j=1;j<=16;++j){
for(int k=1;k<=testtime;++k){
qwq=qwqset[j];
shrink(qwq,dr(M.fi,M.se,k),rd(Mx.fi,Mx.se,k),rd(My.fi,My.se,k));
rotate(qwq,rd(R.fi,R.se,k));
distortion(qwq,dr(Sx.fi,Sx.se,k),rd(Sy.fi,Sy.se,k));
int minx=1e9,miny=1e9,maxx=0,maxy=0,siz=0,x=0,y=0;
for(int I=1;I<=65;++I){
for(int J=1;J<=38;++J){
if(qwq.a[I][J]=='#')x=I,y=J;
vis[I][J]=0;
}
}
vis[x][y]=1;
qwq.dfs(x,y,minx,miny,maxx,maxy,siz);
image js(min(65,maxx-minx+1),min(38,maxy-miny+1));
for(int I=minx;I<=maxx&&I-minx+1<=65;++I){
for(int J=miny;J<=maxy&&J-miny+1<=38;++J)js.a[I-minx+1][J-miny+1]=qwq.a[I][J];
}
qwq=js;middle(qwq);
for(int J=1;J<=38;++J){
for(int I=1;I<=64;++I)dinnerl[j][k][J]=(dinnerl[j][k][J]<<1)+(qwq.a[I][J]=='#');
}
}
}
}
void play(){
for(int i=1;i<=yhbsize;++i){
double maxn=0;int id=0;
for(int j=1;j<=16;++j){
for(int k=1;k<=testtime;++k){
long long cnt=64*38,U;
for(int l=1;l<=38;++l){
U=yhbl[i][l]^dinnerl[j][k][l];
cnt-=__builtin_popcountll(U);
}
double u=cnt/64.0/38.0;
if(u>maxn){
maxn=u;id=j;
}
}
}
lx.push_back(ovo[id]);
}
}
void init(){
for(int i=0;i<16;++i){
for(int j=0;j<65;++j){
long long o=zc[i][j];
c[i+1][j+1].push_back(' ');
for(int k=0;k<38;++k){
if(o%2)c[i+1][j+1].push_back('#');
else c[i+1][j+1].push_back('.');
o/=2;
}
}
}
cin>>t>>m>>n;getchar();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)syx[i][j]=getchar();
getchar();
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int b=0,w=0;
for(int k=0;k<9;++k){
int x=i+v[k][0],y=j+v[k][1];
if(x>=1&&x<=n&&y>=1&&y<=m){
if(syx[x][y]=='#')++b;
else ++w;
if(b>4||w>4)break;
}
}
if(b>w)a[i][j]='#';
else a[i][j]='.';
}
}
for(int j=1;j<=m;++j){
for(int i=1;i<=n;++i){
if(!vis[i][j]&&a[i][j]=='#'){
vis[i][j]=1;
int minx=1e9,miny=1e9,maxx=0,maxy=0,siz=0;
dfs(i,j,minx,miny,maxx,maxy,siz);
if(siz>=30){
image qwq(maxx-minx+1,maxy-miny+1);
for(int k=minx;k<=maxx;++k){
for(int l=miny;l<=maxy;++l){
qwq.a[k-minx+1][l-miny+1]=a[k][l];
}
}
middle(qwq);yhbsize++;
for(int l=1;l<=38;++l){
for(int k=1;k<=64;++k)yhbl[yhbsize][l]=(yhbl[yhbsize][l]<<1)+(qwq.a[k][l]=='#');
}
}
}
}
}
}
void exc(){
int zhan[1005]={0},t=0;
lx=" "+lx;
for(int i=1;i<=lx.size();++i)nxt[i]=0;
for(int i=1;i<=lx.size();++i){
if(lx[i]=='(')zhan[++t]=i;
else if(lx[i]==')')nxt[zhan[t]]=i,t--;
}
}
int calc(string s,int l,int r){
int jia=0,cheng=0,isj=0,isc=0;
if(s[l]=='('&&s[r]==')'&&nxt[l]==r){
return calc(s,l+1,r-1);
}
for(int i=l;i<=r;++i){
if(s[i]=='+')jia=i,isj=1;
else if(s[i]=='-')jia=i,isj=0;
else if(s[i]=='*')cheng=i,isc=1;
else if(s[i]=='/')cheng=i,isc=0;
else if(s[i]=='(')i=nxt[i]-1;
}
if(jia!=0){
if(isj)return calc(s,l,jia-1)+calc(s,jia+1,r);
else return calc(s,l,jia-1)-calc(s,jia+1,r);
}
else if(cheng!=0){
if(isc)return calc(s,l,cheng-1)*calc(s,cheng+1,r);
else return calc(s,l,cheng-1)/calc(s,cheng+1,r);
}
else{
int sum=0;
for(int i=l;i<=r;++i){
sum=sum*10+s[i]-'0';
}
return sum;
}
}
int main(){
init();
train();
play();
exc();
cout<<calc(lx,1,lx.size()-1)<<'\n';
return 0;
}
真·后记
这个最优解其实没什么难度,应该很快就能被超越。但是正是有着一个个打破纪录的人,世界才会有所进步。希望大家在前行的路上继续努力,也希望我的题解对大家有帮助。
本当の本当に終わり。