M-SOLUTIONS Programming Contest 2021(AtCoder Beginner Contest 232) 题解
因为偷懒就只写G和H的题解了。
G - Modulo Shortest Path
首先可以观察到对于一条从点\(i\)到点\(j\)的边,权值只有两种:\(A_i+B_j\)和\(A_i+B_j-M\)。
那么我们假如把点按照\(B\)升序排成一列,那么当中的一个点肯定只会向前半部分连权值为\(A_i+B_j\)的边,后半部分连权值\(A_i+B_j-M\)的边。
我们可以把一个点拆成入点和出点(此时仍旧按照\(B\)升序排成两列),由出点向入点连权值为\(A_i+B_j\)和\(A_i+B_j-M\)的这两种边,入点向对应出点连接权值为\(0\)的边。
虽然此时边数仍旧是\(O(N^2)\)的,但是我们可以在每一个入点向下一个入点连一条权值为它们的\(B_i\)的差值的边,可以看成是一种反悔操作,走到入点了可以不走向出点,而是往下一个入点继续走,再走到对应的出点。这样发现没有必要给每一个点的出点连那么多条边出去了,只需要两条,一条连向序列开头的点,一条连向第一个使得权值和大于等于\(M\)的点。那么每一条原来的出点向入点连接的边都可以看成是一条现在出点向入点连接的边和一条入点构成的链的组合。
接下来只需要从起点到终点跑最短路就行了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,S,T;
pair<pair<int,int>,int> a[200005];
vector<pair<int,int>> g[400005];
ll d[400005];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i].first.first;
for(int i=1;i<=n;i++)cin>>a[i].first.second,a[i].second=i;
sort(a+1,a+1+n,[](const pair<pair<int,int>,int> &a,const pair<pair<int,int>,int> &b){
if(a.first.second!=b.first.second)return a.first.second<b.first.second;
return a.second<b.second;
});
S=1;
while(a[S].second!=1)S++;
T=1;
while(a[T].second!=n)T++;
for(int i=1;i<n;i++){
g[n+i].emplace_back(n+i+1,a[i+1].first.second-a[i].first.second);
}
for(int i=1;i<=n;i++){
g[n+i].emplace_back(i,0);
g[i].emplace_back(n+1,a[i].first.first+a[1].first.second);
int l=1,r=n,mid,res=-1;
while(l<=r){
mid=l+r>>1;
if(a[i].first.first+a[mid].first.second>=m){
res=mid;
r=mid-1;
}else{
l=mid+1;
}
}
if(res!=-1)g[i].emplace_back(n+res,a[i].first.first+a[res].first.second-m);
}
priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> q;
q.emplace(0,S);
memset(d,0x3f,sizeof(d));
d[S]=0;
while(!q.empty()){
ll cd;
int x;
tie(cd,x)=q.top();
q.pop();
if(cd>d[x])continue;
for(auto &[y,z]:g[x])if(d[y]>cd+z){
q.emplace(d[y]=cd+z,y);
}
}
cout<<d[T]<<'\n';
return 0;
}
H - King's Tour
比赛时没有想到递归处理的我真是铸币呜呜呜
首先可以考虑只有两行或者只有两列的棋盘怎么处理,那么由于八向移动的特性可以这么处理(起点在左上角,红点为终点):

然后就考虑行数和列数都至少为\(3\)的情况(同样默认起点左上角),尝试走过最上方的一行,或者最左边的一列,由于终点一定不会在左上角,且行数和列数都大于\(2\),那么一定两种操作可以选做一种,并且做完以后剩下来没访问过的棋盘仍旧是满足起点在一个角上且终点不和起点相同位置。
然后递归处理即可。
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>> sol(int n,int m,int a,int b){
vector<pair<int,int>> r;
if(m==2){
for(int i=1;i<a;i++){
r.emplace_back(i,1);
r.emplace_back(i,2);
}
for(int i=a;i<=n;i++)r.emplace_back(i,b^3);
for(int i=n;i>=a;i--)r.emplace_back(i,b);
}else if(n>2&&(a>2||a==2&&b!=m)){
for(int i=1;i<=m;i++)r.emplace_back(1,i);
for(auto &[x,y]:sol(n-1,m,a-1,m+1-b))r.emplace_back(x+1,m+1-y);
}else{
r=sol(m,n,b,a);
for(auto &[x,y]:r)swap(x,y);
}
return r;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m,a,b;
cin>>n>>m>>a>>b;
for(auto &[x,y]:sol(n,m,a,b))cout<<x<<' '<<y<<'\n';
return 0;
}
M-SOLUTIONS Programming Contest 2021(AtCoder Beginner Contest 232) 题解的更多相关文章
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- atcoder beginner contest 251(D-E)
Tasks - Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)\ D - At Most 3 (Contestant ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- 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 255(E-F)
Aising Programming Contest 2022(AtCoder Beginner Contest 255) - AtCoder E - Lucky Numbers 题意: 给两个数组a ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
随机推荐
- [bzoj1593]旅馆
用线段树维护区间中最大的一段连续的1,以左端点为左端点最大的一段连续的1,以右端点为右端点最大的一段连续的1,然后就可以支持区间修改和查询了 1 #include<bits/stdc++.h&g ...
- SpringMVC注解搭配环境
1.准备文件 2.工程中的pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- 什么是JIT?
目录 什么是JIT? 为什么HotSpot虚拟机要使用解释器与编译器并存的架构? 编译的时间开销 什么是JIT? 1.动态编译(dynamic compilation)指的是"在运行时进行编 ...
- SpringCloud升级之路2020.0.x版-44.避免链路信息丢失做的设计(2)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们在这一节我们将继续讲解避免链路信息丢失做的设计,主要针对获取到现有 Span 之后,如 ...
- AT2558 [ARC073D] Many Moves
开始被标签带骗了. 考虑一个\(dp\),\(f[i][j]\)代表有一个棋子在\(x_i\),另外一个\(j\)的最小答案. 那么考虑转移. 如果\(j != x_{i - 1}\) 那么答案自然贡 ...
- Codeforces 536D - Tavas in Kansas(dp)
Codeforces 题目传送门 & 洛谷题目传送门 其实这题本该 2019 年 12 月就 AC 的(详情请见 ycx 发此题题解的时间),然鹅鸽到了现在-- 首先以 \(s,t\) 分别为 ...
- Congratulations, FYMS-OIers!
Fuzhou Yan'an Middle School Online Judge 又一次上线啦! 真的是一波三折,主要功劳必须得属于精通网页编排.ubuntu 下如何使用 rm -rf 语句但是又能够 ...
- Boussinesq 近似及静压假定,内外模分离方法(附录A)
0.Formulation of the RANS equations [1] 不可压缩流体控制方程 \[\begin{array}{l l} \frac{\partial u}{\partial x ...
- VMware和Centos的安装及配置
目录 1. 安装VMware 2. 安装CentOS6及配置 2.1 Centos安装 2.1.1 配置网络连接的三种形式 2.1.1.1 桥连接 2.1.1.2 NAT模式 2.1.1.3 主机模式 ...
- 非标准的xml解析器的C++实现:二、解析器的基本构造:语法表
解析器的目的:一次从头到尾的文本遍历,文本数据 转换为 xml节点数据. 这其实是全世界所有编程语言编译或者转换为虚拟代码的基础,学会这种方法,发明一种编程语言其实只是时间问题,当然了,时间也是世界上 ...