[题解]AtCoder Beginner Contest 413(ABC413) A~G
A - Content Too Large
输出Yes\(\iff \sum a_i\le m\)。
时间复杂度\(O(n)\)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
signed main(){
cin>>n>>m;
for(int i=1,x;i<=n;i++) cin>>x,m-=x;
cout<<(m<0?"No\n":"Yes\n");
return 0;
}
B - cat 2
枚举\(i,j\),扔到set里面统计即可。
时间复杂度\(O(n^2\log(n^2))=O(n^2\log n)\)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n;
string s[N];
set<string> se;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j) se.insert(s[i]+s[j]);
}
}
cout<<se.size();
return 0;
}
C - Large Queue
操作\(1\),将输入的\((c,x)\)作为一个整体,压入队列。
操作\(2\),不断出队列,直到\(k\)为\(0\)为止。若最后一个出队列的元素还没用完,再把剩下的从队头压入回队列。
因为出入栈次数上界都是\(2q\),所以时间复杂度为\(O(q)\)。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Q=2e5+10;
int n;
deque<pair<int,int>> q;
signed main(){
cin>>n;
int op,c,x;
while(n--){
cin>>op;
if(op==1){
cin>>c>>x;
q.push_back({c,x});
}else{
int ans=0;
cin>>c;
while(!q.empty()){
auto t=q.front();
q.pop_front();
if(c<t.first){
ans+=c*t.second;
q.push_front({t.first-c,t.second});
break;
}
c-=t.first;
ans+=t.first*t.second;
}
cout<<ans<<"\n";
}
}
return 0;
}
D - Make Geometric Sequence
下文中\(r\)表示公比。
对于\(|r|<1\),我们可以通过将序列翻转来让\(|r|\ge 1\)。
因此仅需判断是否存在这样的\(|r|\ge 1\)即可。
所以我们仅需将\(a\)按绝对值从小到大排序,看相邻元素是否都满足:
\]
即:
\]
然而我们发现\(r=-1\)的情况下,排序得到的\(a\)会有不同的形态。此时需要特判一下,即:
- 若将满足\(a[i]=a[1]\)的\(i\)的个数记为\(x\),\(a[i]=-a[i]\)的\(i\)的个数记为\(y\),则有\(x+y=n\)且\(|x-y|\le 1\)。
时间复杂度\(O(n\log n)\)。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int t,n,a[N];
bool solve(){
cin>>n;
int c1=0,c2=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
if(a[i]==a[1]) c1++;
else if(a[i]==-a[1]) c2++;
if(c1+c2==n&&abs(c1-c2)<2) return 1;
sort(a+1,a+1+n,[](int a,int b){return abs(a)<abs(b);});
for(int i=2;i<n;i++)
if(a[i]*a[i]!=a[i-1]*a[i+1]) return 0;
return 1;
}
signed main(){
cin>>t;
while(t--) cout<<(solve()?"Yes\n":"No\n");
return 0;
}
E - Reverse 2^i
转化一下题意,相当于一棵完全二叉树,叶子节点存储的是\(a_1,a_2,\dots,a_{2^n}\)。可以任意次交换某个节点的左右子树。最后要使得叶子结点的字典序最小。

那么就有一个显然的贪心思路:每个节点仅需让左右子树中,\(\min\)值较小的那个作为左子树。
因为满足最优子结构所以正确性可以保证。
时间复杂度\(O(2^n)\)。
点击查看代码
#include<bits/stdc++.h>
const int N=(1<<18)+10;
using namespace std;
int t,n,nn,f[N<<1],l[N],r[N];
void dfs(int x){
if(x<nn) dfs(l[x]),dfs(r[x]);
else cout<<f[x]<<" ";
}
signed main(){
cin>>t;
while(t--){
cin>>n;
nn=(1<<n);
for(int i=0;i<nn;i++) cin>>f[nn+i];
for(int i=nn-1;~i;i--){
f[i]=min(f[l[i]=(i<<1)],f[r[i]=(i<<1|1)]);
if(f[l[i]]>f[r[i]]) swap(l[i],r[i]);
}
dfs(1);
cout<<"\n";
}
return 0;
}
F - No Passage
若没有Aoki的限制,我们使用BFS跑一遍最短路就可以。
加上限制之后,我们定义\(d[i][j]\)表示从\((i,j)\)开始,在Aoki的限制之下到达目标格子的最少步数。
Aoki为了让\((i,j)\)步数最大,一定会把周围\(d\)值最小的方向禁用掉。
因此\(d[i][j]\)仅能从周围次小的\(d\)值进行转移。
时间复杂度\(O(nm)\)。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e3+10,M=3e3+10;
int n,m,k,d[N][M],dx[4]{-1,0,1,0},dy[4]{0,1,0,-1},ans;
queue<pair<int,int>> q;
int sec(int x,int y){
vector<int> v={d[x][y-1],d[x][y+1],d[x-1][y],d[x+1][y]};
sort(v.begin(),v.end());
return v[1];
}
signed main(){
memset(d,0x3f,sizeof d);
cin>>n>>m>>k;
for(int i=1,x,y;i<=k;i++){
cin>>x>>y;
d[x][y]=0;
q.push({x,y});
}
while(!q.empty()){
auto t=q.front();
q.pop();
int x=t.first,y=t.second;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<1||xx>n||yy<1||yy>m) continue;
int td=sec(xx,yy);
if(td+1<d[xx][yy]){
d[xx][yy]=td+1;
q.push({xx,yy});
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(d[i][j]!=d[0][0]){
ans+=d[i][j];
}
}
}
cout<<ans<<"\n";
return 0;
}
G - Big Banned Grid
\((1,1)\)走不到\((n,m)\),当且仅当存在一个障碍物组成的八连通分量,使得它同时连接左/下边缘和右/上边缘。
八连通即通过八个方向可以走到。
时间复杂度\(O(k\log k)\)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
vector<int> lef,bot;
set<pair<int,int>> se;
int dx[8]{-1,-1,0,1,1,1,0,-1},dy[8]{0,1,1,1,0,-1,-1,-1};
bool dfs(int x,int y){
if(se.find({x,y})==se.end()) return 0;
se.erase({x,y});
if(x==1||y==m) return 1;
for(int i=0;i<8;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<1||xx>n||yy<1||yy>m) continue;
if(dfs(xx,yy)) return 1;
}
return 0;
}
signed main(){
cin>>n>>m>>k;
for(int i=1,x,y;i<=k;i++){
cin>>x>>y;
se.insert({x,y});
if(x==n) bot.push_back(y);
if(y==1) lef.push_back(x);
}
for(int i:bot) if(dfs(n,i)) cout<<"No\n",exit(0);
for(int i:lef) if(dfs(i,1)) cout<<"No\n",exit(0);
cout<<"Yes\n";
return 0;
}
F、G参考:https://www.cnblogs.com/stelayuri/p/18968065
[题解]AtCoder Beginner Contest 413(ABC413) A~G的更多相关文章
- 题解 AtCoder Beginner Contest 168
小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- AtCoder Beginner Contest 220部分题(G,H)题解
刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...
- [题解] Atcoder Beginner Contest ABC 265 Ex No-capture Lance Game DP,二维FFT
题目 首先明确先手的棋子是往左走的,将其称为棋子1:后手的棋子是往右走的,将其称为棋子2. 如果有一些行满足1在2右边,也就是面对面,那其实就是一个nim,每一行都是一堆石子,数量是两个棋子之间的空格 ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- AtCoder Beginner Contest 173 题解
AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...
- AtCoder Beginner Contest 148 题解
目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...
随机推荐
- 运维排查 | SaltStack 远程命令执行中文乱码问题
哈喽大家好,我是咸鱼. 问题 我在一台服务器上写了一个简单的 Python 脚本 haha.py,内容如下: [root@localhost ~]# cat haha.py print("你 ...
- JPA在SpringBoot中简单使用
前言 在SpringBoot项目中可以与JPA进行搭配,这样会省很多的开发时间,以下为JPA的简单使用 一.导入依赖 <!-- springboot jpa依赖--> <depend ...
- 数栈V6.0全新产品矩阵发布,数据底座 EasyMR 焕新升级
4月20日,袋鼠云成功举行了以"数实融合,韧性生长"为主题的2023春季生长大会.会上,袋鼠云自主研发的一站式大数据基础软件--数栈V6.0产品矩阵全新发布.对旗下大数据基础平台. ...
- C#支持格式最多的解压缩开源库SharpCompress
string archivePath = "path/to/"; string extractPath = "path/to/extract/folder"; ...
- C# winForm打包的的麻烦过程
https://www.cnblogs.com/qiantao/p/9468570.html 作为研发人员,在本机上开发的winform.wpf或者控制台程序需要发给其他人测试时候,一般需要对其进行打 ...
- C# 子类给父类构造函数传值
BIG阳 通过BAse 来用,在子类中,你调用的类型要和父类的调用类型相同才行,不然会出错class A {public A(int a, int b) {}}class B : A {public ...
- centos7导入很大的数据库脚本
前提因为远程桌面,图形化界面实在是太慢了 所以将压缩数据库文件传入到服务器某个目录下aggs_court.sql.gz解压gunzip aggs_court.sql.gz进入数据库:mysql -p@ ...
- Java中==与equals()函数的区别
前段时间写网站,在servlet中要对用户输入的密码做判断,就出现一个很奇怪的现象:if条件句中如果用"=="作判断条件,就没法通过验证,而一换成equlas()函数,就完美解决了 ...
- 一文说清楚ETL与Kafka如何实现集成
ETL与Kafka为何需要集成? 随着企业对实时流数据的处理要求越来越高,很多企业都把实时流数(日志.实时CDC采集数据.设备数据-)先推入到kafka中,再通过ETL对kafka中的数据进行消费通过 ...
- ETL数据集成丨SQLServer到Doris的无缝数据同步策略
在数据驱动的新时代,企业对数据的需求日益增加,尤其是数据同步的速度和准确性.随着数据源和数据目标的多样化,如何实现高效.无缝的数据同步成为了许多企业的关注焦点.ETLCloud正是这一领域的先锋,为用 ...