[题解](更新中)AtCoder Beginner Contest 386(ABC386) A~E

news/2024/12/31 6:07:23/文章来源:https://www.cnblogs.com/Sinktank/p/18638584

A - Full House 2

容易发现,答案为Yes\(\iff\)输入中恰好出现了\(2\)种不同的数,可以用set等数据结构来计算不同元素的个数。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
set<int> se;
signed main(){for(int i=1,a;i<=4;i++){cin>>a;se.insert(a);}cout<<(se.size()==2?"Yes":"No");return 0;
}

B - Calculator

从头遍历字符串,贪心将现有的00替换成0即可。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s;
int n,cnt;
signed main(){cin>>s;n=s.size();s=s+' ';for(int i=0;i<n;i++){if(s[i]=='0'&&s[i+1]=='0') i++;cnt++;}cout<<cnt<<"\n";return 0;
}

C - Operate 1

\(|s|=n,|t|=m\),则根据\(n,m\)的大小关系讨论:

  • \(|n-m|>1\)No

  • \(n+1=m\):双指针\(i,j\)分别指向\(s[0],t[0]\)开始匹配:

    • 如果\(s[i]\ne t[j]\),则\(j\leftarrow (j+1)\)
    • 如果\(s[i]=t[j]\),则\(i\leftarrow (i+1)\)\(j\leftarrow (j+1)\)

    如果中途失配次数\(\le 1\),则Yes,否则No

  • \(m+1=n\):交换\(s,t\),然后同\(n+1=m\)的做法。

  • \(n=m\)\(s,t\)不匹配的位置\(\le 1\),则Yes,否则No

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
string s,t;
bool solve(){if(abs(n-m)>1) return 0;if(n==m){int cnt=0;for(int i=0;i<n;i++)cnt+=(s[i]!=t[i]);return cnt<=1;}if(n-1==m) swap(s,t);bool f=0;for(int i=0,j=0;i<n;i++,j++){if(s[i]!=t[j]){if(f) return 0;else f=1,i--;}}return 1;
}
signed main(){cin>>k>>s>>t;n=s.size(),m=t.size();cout<<(solve()?"Yes":"No")<<"\n";return 0;
}

题解还提供了一种做法:删掉\(s,t\)相同的前缀和后缀,如果最终\(|s|\le 1\)\(|t|\le 1\),则为Yes,否则No

D - Diagonal Separation

下文的“块”均指已被着色的方格。

容易发现,答案合法\(\iff\)不存在一个黑色块在一个白色块的右下方。

证明

因为根据题意,每个黑色块上面和左边的所有格子都必须是黑色,每个白色块下面和右边的所有格子都必须是白色。

如果存在一个黑色块在一个白色块的右下方,它们所管辖范围就会产生两个交点,这两个交点无法同时满足黑色与白色,所以不合法;否则显然合法。

根据这个结论,也相当于判断是否每个黑块左上方都没有白块。

所以我们可以按行从小到大为第一关键字,列从小到大为第二关键字。

  • 对于当前遍历到的白块\((x,y)\),将\(y\)加入set

  • 对于当前遍历到的黑块\((x,y)\),存在set中的,有且仅有\(1\sim(x-1)\)行的所有白块,和第\(x\)行第\((1\sim y)\)列的所有白块。显然答案只可能在它们之中。

    这些白块已经满足了在\((x,y)\)上方,仅需再限制在\((x,y)\)左边即可,即查找set中是否存在值\(k\le y\),可以用二分查找实现。

时间复杂度\(O(m\log m)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct Point{int x,y;char c;};
bool cmp(Point a,Point b){return a.x==b.x?(a.y==b.y?a.c=='W':a.y<b.y):a.x<b.x;}
vector<Point> a;
set<int> se;
int n,m;
bool solve(){for(Point i:a){if(i.c=='W') se.insert(i.y);else if(se.upper_bound(i.y)!=se.begin()) return 0;}return 1;
}
signed main(){cin>>n>>m;for(int i=1;i<=m;i++){int x,y;char c;cin>>x>>y>>c;a.emplace_back((Point){x,y,c});}sort(a.begin(),a.end(),cmp);cout<<(solve()?"Yes":"No")<<"\n";return 0;
}

虽然题目限制了被着色的方格互不相同,但为了让代码更健壮,我处理了这种情况,对于相同的\((x,y)\),在排序时令白格子在前。

E - Maximize XOR

如果暴搜,时间复杂度将是\(O(C_n^k\times k)\),无法通过……吗?

的确是这样,就算题目限制了\(C_n^k\le 10^6\),在\(n\)较大的情况下仍会严重超时。

但我们知道\(C_n^k=C_n^{n-k}\),所以当\(k>\frac{n}{2}\),让\(k\leftarrow (n-k)\),枚举的就是不选哪些数。时间复杂度变成了\(O(C_n^k\times \min(k,n-k))\)

这样的时间复杂度是可以通过的,下面是感性理解:

  • 经计算,在\(n\ge 23\)时,要想使得\(C_n^k\le 10^6\),就必须使\(k<10\),再往后\(k\)会更小,所以时间复杂度不会超过\(O(10^6\times 10)\)
  • 而在\(n<23\)时,由于\(k\le \frac{n}{2}\),所以时间复杂度也不会超过\(O(10^6\times 11)\)
点击查看代码
#include<bits/stdc++.h>
#define N 200010
#define int long long
using namespace std;
int n,k,a[N],p[N],tmp,ans;
void dfs(int pos,int cnt){if(pos>k){int x=tmp;for(int i=1;i<=k;i++) x^=a[p[i]];ans=max(ans,x);return;}for(int i=cnt;i<=n-k+pos;i++){p[pos]=i;dfs(pos+1,i+1);}
}
signed main(){cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];if(k>n/2){k=n-k;for(int i=1;i<=n;i++) tmp^=a[i];}dfs(1,1);cout<<ans<<"\n";return 0;
}

F - Operate K

补题中……

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

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

相关文章

为什么要做纯血鸿蒙操作系统?

在10月22日,华为最新的原生鸿蒙之夜暨全场景新品发布会上,余承东正式发布了“纯血鸿蒙”操作系统,这是继苹果iOS和安卓系统之后的全球第三大移动操作系统,同时也标志着国产操作系统实现了全面突破。(央视新闻报道https://mp.weixin.qq.com/s/IFatTQ7u7h92iGrr-xEedw)。那…

GIMP 处理 png 透明边缘

首先设置画布大小然后点击 图层 -> 图层到图像大小

时间的本质-计算视角

原作:Stephen Wolfram计算机视域下的时间 时间是人类经验的核心。然而,究竟什么是时间?在传统科学中,它常被比作空间坐标(尽管这种坐标对我们来说总是不断增长)。尽管这种描述在数学上可能很有用,但它并没有揭示时间的本质。 一旦我们开始用计算术语思考,就会觉得越来越…

中考英语优秀范文-002 Music 音乐

1 写作要求 作家雨果说过:“开启人类智慧的钥匙有三把,一是字母,二是数字,三是音符。”从这句话中,我们足可见音乐对人的发展的影响。请你根据以下提示,以Music为题,写一篇短文参加学校的英语作文竞赛。 提示: 1音乐使人充满活力,让人快乐; 2 没有音乐,生活就没有乐…

Windows11安装Linux子系统(WSL2)

1、确认BIOS中已经打开虚拟化 Virtualization Technology (我的机器默认已经打开 Enabled / Disabled,主板不同进入的地方不一样,自行搜索) 2、以管理员身份打开 PowerShell 3、输入(此步安装WSL): dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subs…

软工个人总结

结束了? 一、学期回顾 1.1 课程想象与现实 最初听闻软件工程课程,脑海中浮现的是一群程序员在电脑前敲打着代码,创造出一个个功能强大的软件。想象着自己能通过这门课,精通多种编程语言,独立开发出令人惊艳的应用程序。可是在第一次编程作业布置下来时,发现自己什么也不会…

UML之关联

关联指两个类之间的各种联系。UML使用各种单实线表示关联,但关联所能够表达的信息远不只是一条实线所传递的依赖。关联指两个类之间的各种联系。UML使用各种单实线表示关联,这个单实线可以是直线(垂直的、水平的或者倾斜的)、折线甚至曲线。 事实上,关联也是展示类的属性的…

代码随想录——动态规划13.分割等和子集

思路 难点 我只想到了:“找一个子集,每个数取或不取求其和,看是否和另一个子集的和相等 ” 但是实际上既然是两个子集相等,那么只要和等于 sum/2 即可了! 取或不取用01背包,但是不知道怎么用。 只有确定了如下四点,才能把01背包问题套到本题上来。背包的体积为sum / 2 背…

深度解析 Transformer 模型中的位置嵌入(Positional Embedding)

在自然语言处理中,词语的顺序对句子的意义至关重要。然而,传统的自注意力机制无法区分词语的位置。本文深入浅出地介绍了**位置嵌入(Positional Embedding)**的概念及其在Transformer模型中的作用,解释了它如何帮助模型理解词语的顺序,从而提升文本处理的准确性。通过简单…

java8--方法--格式化输出--printf--索引

System.out.printf("%1$s %2$tB %2$te %2$tY","Due date",new Date()); 效果图:ps: 1.一个字符串需要有多个格式化单词,通过建立索引实现,索引值用%$包围,$后紧跟格式化的目标类型,后面按顺序传入变量或填写内容 2.t指定日期类型,b指定填充月份的完…

前端重学之Number

Number (尾附IEEE754解读) mdn文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Numberjs里的number是双进度浮点数 用IEEE745 编码 0b 0o 0x 分别表示 二进制 八进制 十六进制```js 0.tostring() //报错 0 .tostring()//正确 ```IEEE7…

DVWA靶场搭建及错误解决教程

前言 DVWA(Damn Vulnerable Web Application)靶场是一个旨在帮助安全人员和开发人员学习和提高网络安全技能的开源项目。它是一个故意存在多种安全漏洞的 PHP/MySQL 网络应用程序,通常用于学习和测试各种网络攻击技术 工具下载链接:https://pan.quark.cn/s/49ef556eb32b 搭…