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\)按绝对值从小到大排序,看相邻元素是否都满足:

\[\frac{a_{i-1}}{a_i}=\frac{a_i}{a_{i+1}}
\]

即:

\[a_{i-1}\times a_{i+1}=a_i^2
\]

然而我们发现\(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的更多相关文章

  1. 题解 AtCoder Beginner Contest 168

    小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...

  2. [题解] Atcoder Beginner Contest ABC 270 G Ex 题解

    点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...

  3. AtCoder Beginner Contest 220部分题(G,H)题解

    刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...

  4. [题解] Atcoder Beginner Contest ABC 265 Ex No-capture Lance Game DP,二维FFT

    题目 首先明确先手的棋子是往左走的,将其称为棋子1:后手的棋子是往右走的,将其称为棋子2. 如果有一些行满足1在2右边,也就是面对面,那其实就是一个nim,每一行都是一堆石子,数量是两个棋子之间的空格 ...

  5. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  6. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  7. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

  8. AtCoder Beginner Contest 184 题解

    AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...

  9. AtCoder Beginner Contest 173 题解

    AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...

  10. AtCoder Beginner Contest 148 题解

    目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...

随机推荐

  1. sort等常用方法和技巧

    sort等常用方法和技巧 sort sort(first_pointer,first_pointer+n,cmp) 原理:sort并不是简单的快速排序,它对快速排序进行了优化.此外,它还结合了插入排序 ...

  2. LLM 上下文长度详细介绍

    1.概述 在<Token:大语言模型的"语言乐高",一切智能的基石>与<LLM 输出配置 (LLM output configuration)>这两篇博文中 ...

  3. tcpdump工具使用

    一.简单介绍 tcpdump命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析. 二.使用语法 语法: tcpdump (选 ...

  4. 如何给 GitHub Copilot "洗脑”,让 AI 精准遵循指令产出高质量代码

    引子 最近在项目中使用 GitHub Copilot 的过程中,我发现了一个很有趣的现象. 当我让 Copilot 帮我写代码时,它总是热情满满地给出一大段实现.但当我仔细审视这些代码时,却经常会发现 ...

  5. 袋鼠云数据湖平台「DataLake」,存储全量数据,打造数字底座

    一.什么是数据湖? 在探讨数据湖技术或如何构建数据湖之前,我们需要先明确,什么是数据湖? 数据湖的起源,应该追溯到2010年10月.基于对半结构化.非结构化存储的需求,同时为了推广自家的Pentaho ...

  6. SQL Server 链接服务器"XXXXXXX"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息 "没有活动事务。"。

    一.确保互联双方服务器MS DTC服务已启动并正确配置 打开"服务"管理控制台(services.msc) 找到"Distributed Transaction Coor ...

  7. 用<marquee>实现图片上下滚动

    首先让我们认识这个<marquee>标签,它是成对出现的标签,首标签<marquee>和尾标签</marquee>之间的内容就是滚动内容.<marquee&g ...

  8. Hack 说明

    在今天的模拟赛中,部分同学由于对出现某个数在模 \(1000000007\) 意义下为 \(0\) 的情况不规范被 Hack. Hack 原理:开始时有 \(2\) 个 \(1\),先都加到 \(10 ...

  9. 9.Java SDK源码分析系列笔记-LinkedHashMap

    目录 1. 是什么 2. 使用 3. 实现 3.1. uml 3.2. 构造方法 3.3. put 3.3.1. 创建LinkedHashMap增强的节点--Entry[既是Node数组的节点又是双向 ...

  10. C# HttpListener 的使用方法

    关于监听回调两次的原因,可能是因为重新监听导致的,所以查到微软上面的解析是说 BeginGetContext方法开始异步 (非阻塞) 调用以接收传入的客户端请求. 在调用此方法之前,必须调用 Star ...