AtCoder Beginner Contest 387 赛后复盘

news/2025/1/8 8:07:03/文章来源:https://www.cnblogs.com/CodingGoat/p/18652570

省流:A,B,C,D,F

image

A - B

模拟即可。

C

数位 dp。

首先我们先将问题转换为 \([1,R]\) 中蛇数的个数减去 \([1,L-1]\) 中蛇数的个数。
\(num_i\) 为数字的第 \(i\) 位(从左往右数)。
我们设 \(f_{dep,mx,lim,ze}\) 表示当前第 \(dep\) 位,首位为 \(mx\),有没有达到上限,有没有前导零。

那么每一次向下搜索,当枚举当前位是 \(i\) 时,我们分类讨论。

要么就是有前导零,此时这一位为首位,那么 \(f_{dep,mx,lim,ze} \leftarrow f_{dep-1,i,lim\operatorname{and} [i=num_{dep}],ze \operatorname{and} [i=0]}\)
要么就是没有前导零,此时只有 \(i<mx\) 才可以向下搜。那么 \(f_{dep,mx,lim,ze} \leftarrow f_{dep-1,mx,lim\operatorname{and} [i=num_{dep}],0}\)

要记忆化搜索,数位 dp 的时间复杂度才是对的。

点击查看代码
#include<bits/stdc++.h>#define int ll
#define ll long long
#define i128 __int128#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")using namespace std;int read() {int x=0,f=1; char c=getchar();for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }#define maxn 200050int l,r;int f[21][11][2][2];//位数,首位数,上限,前导零
int num[21],top;int dfs(int dep,int mx,int lim,int ze) {if(!dep) return 1;if(f[dep][mx][lim][ze]!=-1) return f[dep][mx][lim][ze];int res=0;For(i,0,9) if((!lim)||i<=num[dep]) {if(ze) res+=dfs(dep-1,i,((i==num[dep])&&lim),((i==0)&&ze));else if(i<mx) res+=dfs(dep-1,mx,((i==num[dep])&&lim),0);}return f[dep][mx][lim][ze]=res;
}int work(int x) {m1(f);m0(num);top=0;while(x) {num[++top]=x%10;x/=10;}if(top<=1) return num[1]+1;return dfs(top,10,1,1);
}signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
//	int _=1;
//	_=read();cin>>l>>r;cout<<work(r)-work(l-1);return 0;
}

D

简单搜索。

我们对于每一个点额外记录一维表示转移过来是竖着还是横着,剩下就是 bfs 了。

点击查看代码
#include<bits/stdc++.h>#define ll long long
#define i128 __int128#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")using namespace std;int read() {int x=0,f=1; char c=getchar();for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }#define maxn 1050bool vis[2][maxn][maxn];int h,w;
char mp[maxn][maxn];
int sx,sy,ex,ey;int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};struct node {int a,b,c,d;
};void work() {cin>>h>>w;For(i,1,h) For(j,1,w) {cin>>mp[i][j];if(mp[i][j]=='S')sx=i,sy=j;if(mp[i][j]=='G')ex=i,ey=j;}queue<node>q;q.push({sx,sy,0,1});q.push({sx,sy,0,2});while(!q.empty()) {auto [x,y,cnt,flg]=q.front();q.pop();if(vis[flg-1][x][y]) continue;vis[flg-1][x][y]=1;if(x==ex&&y==ey) return cout<<cnt,void();For(i,1,4) if((i+1)/2!=flg) {int X=x+dx[i],Y=y+dy[i];if(X>0&&X<=h&&Y>0&&Y<=w&&mp[X][Y]!='#'&&!vis[((i+1)/2)-1][X][Y]) q.push({X,Y,cnt+1,(i+1)/2});}}cout<<-1;
}signed main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _=1;
//	_=read();For(i,1,_) {work();}return 0;
}

F

你是一名 OIer。你在打 abc387 的时候看到了这道题。
你并不会 E,所以你打算死磕 F。

你发现这个大小关系可以转换成图论的连边,然后再跑 dp 就好了。
你发现如果图上有环的话,那么环上的数都相等。于是你立马想到了缩点。
你立马敲完了 Tarjan 缩点,虽然你随后发现这张图一定是基环树森林,所以只需要跑拓扑就可以缩点了。

然后就是 dp。
你设 \(f_{i,j}\) 表示第 \(i\) 个点的值为 \(j\) 时的情况总数,那么初始情况就是 \(f_{i,j}=1(i\in[1,n],j\in[1,m])\)
然后你列出了转移方程,当 \(u,v\) 想连时:\(f_{u,i}=\sum_{j=1}^{m} f_{u,j}\)
你发现这个 dp 是 \(O(nm^2)\) 的,过不了。
就在你要丧失信心时,你突然发现 dp 的 \(\sum_{j=1}^{m} f_{u,j}\) 可以用前缀和优化。

你迅速的打完了这个优化,又突然发现你不会统计方案。
你发现由于每个点只有一条出边,所以这个图形最后只会是一条条链,那么你需要的答案就是链的终点的所有值之和,用乘法原理计算即可。

这是你的代码:

点击查看代码
#include<bits/stdc++.h>#define int ll
#define ll long long
#define i128 __int128#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")using namespace std;int read() {int x=0,f=1; char c=getchar();for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }#define maxn 2250int n,m;
int a[maxn];vector<int> G[maxn];
int dfn[maxn],dfncnt,low[maxn];
int stk[maxn],stktop;
bool instk[maxn];int bel[maxn],belcnt;void Tarjan(int u) {low[u]=dfn[u]=++dfncnt;instk[(stk[++stktop]=u)]=1;for(auto v:G[u]) {if(!dfn[v]) Tarjan(v),low[u]=min(low[u],low[v]);else if(instk[v]) low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]) {belcnt++;while(1) {int v=stk[stktop--];instk[v]=0;bel[v]=belcnt;if(u==v) break;}}
}int deg[maxn];
int f[maxn][maxn];void work() {in2(n,m);For(i,1,n) {in1(a[i]);G[i].push_back(a[i]);}For(i,1,n) if(!dfn[i]) Tarjan(i);For(i,1,n) G[i].clear();For(i,1,n) if(bel[i]!=bel[a[i]]) G[bel[i]].push_back(bel[a[i]]),deg[bel[a[i]]]++;queue<int> q;For(i,1,belcnt) if(!deg[i]) q.push(i);For(i,1,belcnt) For(j,1,m) f[i][j]=1;int ans=1;while(!q.empty()) {int u=q.front();q.pop();For(i,1,m) (f[u][i]+=f[u][i-1])%=mod;if(G[u].size()==0) (ans*=f[u][m])%=mod;for(auto v:G[u]) {deg[v]--;For(i,1,m) (f[v][i]*=f[u][i])%=mod;if(deg[v]==0) q.push(v);}}cout<<ans;
}signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);int _=1;
//	_=read();For(i,1,_) {work();}return 0;
}

你交了上去,并获得了 550pts,这使得你的排名暴涨。

你笑了出来,笑着笑着,你感觉眼前一阵眩晕。同时有一个熟悉的声音呼唤着你:“起床了”。
你醒了,看到了旁边把你摇醒的同学,指了指台上的道法老师。
原来这一切都只是上道法课时的睡觉的幻想罢了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

厨师服穿戴智能监测摄像机

厨师服穿戴智能监测摄像机的应用可以提高厨师在工作中的效率和规范性。通过摄像头的实时监测功能,主厨或者厨房管理人员可以远程观察厨师的工作情况,及时发现问题并进行指导和纠正。此外,设备还能够实现对厨房工作流程的记录和分析,为厨师提供数据支持,帮助其更好地管理工…

骑车不戴头盔监测摄像机

骑车不戴头盔监测摄像机的作用是对骑行者是否戴头盔进行监测和识别,当监测到有骑行者未戴头盔时,摄像机会发出警报,并提示骑行者戴上头盔。这种智能设备可以有效地规范骑行行为,提高骑行安全系数,减少交通事故的发生率。此外,通过监测和识别,还可以对骑行者未戴头盔的行…

电瓶车进电梯识别报警摄像机

电瓶车进电梯识别报警摄像机的作用是对电动车进入电梯过程中的安全情况进行监测和预警,及时发现潜在的安全隐患,提醒用户和管理人员采取相应措施避免事故发生。这种智能设备可以通过监测电动车进入电梯的行为、车辆状态等信息,进行实时分析和判断,发现电动车可能存在的安全…

已读乱回

我将safetensors格式的TableGPT2-7B通过llama.cpp转换成gguf

python-selenium (1、配置环境)

准备如下: 1、python以及开发工具PyCharm 2、浏览器以及对应的浏览器驱动 3、下载selenium工具包注意: 浏览器与浏览器驱动 需要版本一致,以goole为例, https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json 这个网站里面有对应谷…

12306分流抢票软件 bypass v1.16.43 绿色版(春节自动抢票工具)

软件介绍 12306Bypass分流抢票软件,易操作强大的12306抢票软件,全程自动抢票,云识别验证码打码,多线程秒单、稳定捡漏,支持抢候补票、抢到票自动付款,支持多天、多车次、多席别、多乘客、短信提醒等功能。1、Bypass分流抢票本身附带云识别模块帮助识别,但实际测试即便是…

这是怎么回事

我只输入了你好

网络_浏览器的通信能力

本文主要介绍了浏览器的通信能力,包括用户代理、AJAX,在用户代理中浏览器具有自动发送请求的能力和自动解析响应的能力;在AJAX中主要有两种实现方式,分别是XMLHttpRequest和Fetch;另外介绍了XML可以监控请求进度可用于文件上传进度的监控,Fetch更擅长处理异步代码具有流的…

(LocalDB)\MSSQLLocalDB相关

系统数据库路径:C:\Users\Administrator\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB 用户数据库默认路径:C:\Users\Administrator 连接字符串:<connectionStrings><add name="AAA" connectionString="data sou…

Mind(信息收集篇)

对于在信息收集中所学习知识点做一总结。免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 七、Mind(信息收集篇)

VOLTE中eSRVCC相关的一些知识点

注:本文中的SRVCC都是指eSRVCC方案。 SRVCC相关的3GPP规范有:3GPP TS 23.216 SRVCC 3GPP TS 23.856 “Single Radio Voice Call Continuity (SRVCC) enhancement; Stage2.” 3GPP TS 23.237 IMS Service Continuity Stage 2 3GPP TS 24.237 IMS Service Continuity Stage 3详…