为什么ABC那么多?建议Atcoder多出些ARC/AGC,好不容易才轮到AGC……

A

签到。就是以黑点为源点做多元最短路,由于边长是1直接bfs就好了,求最长路径。

#include<bits/stdc++.h>
using namespace std;
const int N=,dx[]={,,,-},dy[]={,-,,};
int n,m,ans,qs,qe,d[N][N],qx[N*N],qy[N*N];
char mp[N][N];
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)scanf("%s",mp[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]=='.')d[i][j]=1e9;
else d[i][j]=,qx[qe]=i,qy[qe++]=j;
while(qs<qe)
{
int x=qx[qs],y=qy[qs++];
for(int i=;i<;i++)
{
int u=x+dx[i],v=y+dy[i];
if(u<||u>n||v<||v>m||d[u][v]<=d[x][y]+)continue;
d[u][v]=d[x][y]+,ans=max(ans,d[u][v]);
qx[qe]=u,qy[qe++]=v;
}
}
cout<<ans<<endl;
}

B

实际上上下和左右可以分开算。假设只有U和D,那么所有U/D操作结束后,若保留在棋盘,则在区间[L,R],于是根据是先手还是后手的操作,更改区间,若区间在操作途中为空或最终区间不包含棋子所在行/列,则先手获胜,反之后手获胜

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
int n,m,p,sr,sc;
char s[N],t[N];
bool walk1()
{
int L=,R=n;
for(int i=p;i;i--)
{
if(t[i]=='U')R=min(n,R+);else if(t[i]=='D')L=max(,L-);
if(s[i]=='U')L++;else if(s[i]=='D')R--;
if(L>R)return ;
}
return (sr<L||sr>R);
}
bool walk2()
{
int L=,R=m;
for(int i=p;i;i--)
{
if(t[i]=='L')R=min(m,R+);else if(t[i]=='R')L=max(,L-);
if(s[i]=='L')L++;else if(s[i]=='R')R--;
if(L>R)return ;
}
return (sc<L||sc>R);
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&p,&sr,&sc);
scanf("%s",s+);
scanf("%s",t+);
if(walk1()||walk2())puts("NO");
else puts("YES");
}

C

发现每次操作对树的改变只有2种:1、删去所有叶节点(n=2时不可使用)。2、保留其中一个叶节点,删去其他点(n=1时不可使用)。开始瞎蒙个SG函数的错误结论上去,白掉5min。然后发现树等价于长为直径的链上游戏,于是DP链长度为i时先手是否必胜即可。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
int n,f[N],dep[N];
vector<int>G[N];
void dfs(int u,int fa)
{
for(int i=;i<G[u].size();i++)
if(G[u][i]!=fa)dep[G[u][i]]=dep[u]+,dfs(G[u][i],u);
}
int main()
{
scanf("%d",&n);
f[]=,f[]=;
for(int i=;i<=n;i++)if(f[i-]&&f[i-])f[i]=;else f[i]=;
for(int i=,x,y;i<n;i++)scanf("%d%d",&x,&y),G[x].push_back(y),G[y].push_back(x);
dfs(,);
int t=;
for(int i=;i<=n;i++)if(dep[i]>dep[t])t=i;
for(int i=;i<=n;i++)dep[i]=;
dfs(t,);
t=;
for(int i=;i<=n;i++)t=max(t,dep[i]);
if(f[t])puts("First");else puts("Second");
}

D

很容易发现答案是O(logn)级别的,不妨考虑按照答案分步DP,设f[ans][i][j][k]表示答案<=ans,上下边界分别为i,j,左边界为k,右边界最靠右能达到多少。然后考虑转移,竖切可以直接转移,横切由于枚举横切点发现上下区间的DP值一个是先增后减,另一个是先减后增,然后可以二分转移。假设n,m同级,复杂度O(n3log2n)

#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,f[][N][N][N];
char s[N][N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%s",s[i]+);
for(int i=n;i;i--)
for(int j=i;j<=n;j++)
for(int k=m;k;k--)
if(i==j)
{
if(k==m)f[][i][j][k]=m+;
else f[][i][j][k]=s[i][k]==s[i][k+]?f[][i][j][k+]:k+;
}
else f[][i][j][k]=s[i][k]==s[i+][k]?min(f[][i][i][k],f[][i+][j][k]):k;
for(int ans=,t=;;ans++,t^=)
{
if(f[t][][n][]==m+){printf("%d\n",ans);return ;}
for(int i=n;i;i--)
for(int j=i;j<=n;j++)
for(int k=m;k;k--)
{
f[t^][i][j][k]=f[t][i][j][k]==m+?m+:f[t][i][j][f[t][i][j][k]];
if(i<j)
{
int l=i,r=j-,mid;
while(l<=r)
{
mid=l+r>>;
if(f[t][i][mid][k]<=f[t][mid+][j][k])
f[t^][i][j][k]=max(f[t^][i][j][k],f[t][i][mid][k]),r=mid-;
else f[t^][i][j][k]=max(f[t^][i][j][k],f[t][mid+][j][k]),l=mid+;
}
}
}
}
}

EF

result:rank217 rating+=47 now_rating=1925

AtCoder Grand Contest 033的更多相关文章

  1. Atcoder Grand Contest 033 D - Complexity(dp)

    Atcoder 题面传送门 & 洛谷题面传送门 首先 \(n^5\) 的暴力非常容易想,设 \(dp_{a,b,c,d}\) 表示以 \((a,b)\) 为左上角,\((c,d)\) 为右下角 ...

  2. AtCoder Grand Contest 033 题解

    传送门 我比赛的时候怕不是在睡觉啊-- \(A\ Darker\ and\ Darker\) 我是不是想得太复杂了--根本没必要像我这样做吧-- 首先问题可以转化成令\(p_{i,j}\)表示到\(( ...

  3. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  4. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  5. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  6. AtCoder Grand Contest 010

    AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...

  7. AtCoder Grand Contest 009

    AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...

  8. AtCoder Grand Contest 008

    AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...

  9. AtCoder Grand Contest 007

    AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...

随机推荐

  1. Java版本和功能指南

    您可以使用本指南查找和安装最新的Java,了解Java发行版(AdoptOpenJdk,OpenJDK,OracleJDK等)之间的差异,以及获得Java语言功能的概述,包括Java版本8-13. J ...

  2. 一名资深架构师规划Java程序员五年职业生涯指南

    每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来.今天我给大家分享的是一篇来自阿里大牛对五年工作经验程序员的职业建议,希望 ...

  3. Java 性能优化:面向对象及基础类型使用优化

    性能优化是个大筐,很多东西都能往里面装.虽说性能优化的具体方面比较多,但万丈高楼从地起,这里还是从Java最基本的一些入门知识相关的使用优化进行一些做些总结和建议.如何连最基本的API使用都不会,或不 ...

  4. part11 Vue项目接口联调//真机测试

    何为项目接口联调? 前端代码编译好了  后端接口写好了 我们就需要去掉前端模拟数据干掉 用后端提供的数据.进行前后端的一个调试 如何联调? config目录下面 index.js 文件 dev 中pr ...

  5. CodeForces - 131C The World is a Theatre(组合数)

    题意:已知有n个男生,m个女生.现在要选t个人,要求有至少4个男生,至少1个女生,求有多少种选法. 分析: 1.展开,将分子中的m!与分母中n!相约,即可推出函数C. #pragma comment( ...

  6. Palette 的使用

    Palette有什么用? Palette主要功能就是可以从图片中提取各种与颜色有关的元素.通过使用 Palette ,我们可以很轻松的实现界面风格的统一. Palette的使用很简单,首先你可以从gi ...

  7. java课程之团队开发冲刺阶段1.8

    一.总结昨天进度 1.实现预装sqlite数据库,将数据库放在app的assets目录下,该目录在打包的时候不会压缩,所以数据库文件可以在安装之后继续使用,然后APP安装之后检测外部存储空间是否有这个 ...

  8. VUE- 引用视频组件

    VUE- 引用视频组件 安装依赖 cnpm install vue-video-player -S cnpm install video.js -S 全局引用: 在main.js中 import Vu ...

  9. 第32&35章 数据库的安装&存储实力的管理

    第32章 数据库的安装IO取决于磁盘的个数和接口带宽 版本安装顺序是从低到高存储架构师 第35章 存储实例的管理ASM配置说白了就是ORACLE自己的,不通过操作系统对磁盘进行管理.fdisk -l查 ...

  10. 2020年使用Delphi的25个理由(我觉得四个优点:控件+可视化开发+跨平台+数据库,还有一个编译快,运行快)——人生苦短,我用Delphi!

    25年后从10个使用Delphi的理由到1个至25个使用Delphi 10.3的理由 25年前发布Delphi 1时,我汇总了使用Delphi的十大理由.这是我精通Delphi原始书的序言中的原始列表 ...