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\),在\(k\)较大的情况下仍会严重超时。

但我们知道\(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

补题中……

[题解]AtCoder Beginner Contest 386(ABC386) A~E的更多相关文章

  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 ABC 265 Ex No-capture Lance Game DP,二维FFT

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

  4. AtCoder Beginner Contest 154 题解

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

  5. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  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 172 题解

    AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...

随机推荐

  1. 【pr】利用lrc快速导入歌曲的歌词

    确保你的bgm是原汁原味的,没有经过变速或剪辑 下载lrc https://www.musicenc.com/ pr不能直接导入lrc,需要将lrc转换成srt https://www.lrccon. ...

  2. 如何优雅的关闭channel?

    一.channel使用存在的不方便地方 1.在不改变channel自身状态的情况下,无法获知一个channnel是否关闭. 2.关闭一个已经关闭的channel,会导致panic.因此,如果关闭cha ...

  3. 使用 TRL 训练Reward Model奖励模型

    训练过程 在此示例中,将微调"distilroberta-base"模型. 该formatting_func函数将指令与所选和拒绝的响应相结合,创建两个新字符串.这些字符串被标记化 ...

  4. 商品中心—8.商品C端处理高并发的技术文档

    大纲 1.商品C端的高并发架构 2.商品C端的布隆过滤器组件 3.Guava缓存的封装与使用 4.商品C端的接口设计与运行流程总结 5.商品C端系统对商品数据新增和变更时的处理 1.商品C端的高并发架 ...

  5. 电气设计软件有哪些?EPLAN让你成为专业工程师

    作为一名电气设计师,掌握适合自己的设计软件至关重要.在本文中,我们将向您介绍五款广受欢迎的电气设计软件,无论您是初学者还是专业设计师,这些软件都能帮助您轻松完成各类电气设计任务.让我们一起来了解这些实 ...

  6. Java 通用对象数值比较方法

    前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i. 提示:以下是本篇文章正文内容,下面案例可供参考 说明 主要用于比较两个对象是否相等,特别处理了数值类型的比较(包括字符串形式的数值) ...

  7. Python全栈应用开发利器Dash 3.x新版本介绍(4)

    更多Dash应用开发干货知识.案例,欢迎关注"玩转Dash"微信公众号 大家好我是费老师,在前几期文章中,我们针对Python生态中强大且灵活的全栈应用开发框架Dash,介绍了其3 ...

  8. 利用VBA批量删除Excel中的中文/英文/数字或者替换中英文符号

    ↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 在Excel中经常会遇到去除所有的中文,英文或者数字等情况.但是由于Excel并不支持一次替换所有的中文,英文,数字等,所以有些 ...

  9. 前端开发系列065-JQuery篇之框架简单介绍

    一.jQuery简介 jQuery是一款优秀的javaScript库(框架),该框架凭借简洁的语法和跨平台的兼容性,极大的简化了开发人员对HTML文档,DOM,事件以及Ajax的操作. 主旨口号:写的 ...

  10. sox 改变频率

    http://blog.csdn.net/chenxieyy/article/details/51506766 1,将2.wav文件的采样率修改为16000HZ 命令如下:sox   2.wav   ...