AtCoder Grand Contest 004题解
\(A\)
咕咕
int a,b,c;
int main(){
scanf("%d%d%d",&a,&b,&c);
if((a&1^1)|(b&1^1)|(c&1^1))return puts("0"),0;
printf("%lld\n",min(1ll*a*b,min(1ll*a*c,1ll*b*c)));
return 0;
}
\(B\)
一开始想歪了……
枚举\(2\)操作的次数\(k\),然后用单调队列优化就行了
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
typedef long long ll;
const int N=5005;const ll inf=1e18;
int a[N],q[N],n,x,k;ll res;
void solve(){
int h=1,t=0;ll sum=0;
fp(i,1,n){
while(h<=t&&a[i]<=a[q[t]])--t;
q[++t]=i;
}
fp(i,n+1,n<<1){
while(h<=t&&i-q[h]>k)++h;
while(h<=t&&a[i]<=a[q[t]])--t;
q[++t]=i,sum+=a[q[h]];
}
cmin(res,sum+1ll*k*x);
}
int main(){
scanf("%d%d",&n,&x);res=inf;
fp(i,1,n)scanf("%d",&a[i]),a[i+n]=a[i];
for(k=0;k<n;++k)solve();
printf("%lld\n",res);
return 0;
}
\(C\)
比较秒的思路然而我并没有想出来
只要把它给染成两个\(E\)的样子,紫色的部分都染掉就行了
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
const int N=1005;
char mp[N][N],s[N][N];int n,m;
int main(){
scanf("%d%d",&n,&m);
fp(i,1,n)scanf("%s",mp[i]+1);
fp(i,1,n)fp(j,1,m)s[i][j]=mp[i][j];
fp(i,1,n)s[i][1]='#';for(R int i=1;i<=n;i+=2)fp(j,1,m-1)s[i][j]='#';
fp(i,1,n){
fp(j,1,m)putchar(s[i][j]);
putchar('\n');
}
putchar('\n');
fp(i,1,n)fp(j,1,m)s[i][j]=mp[i][j];
fp(i,1,n)s[i][m]='#';for(R int i=2;i<=n;i+=2)fp(j,2,m)s[i][j]='#';
fp(i,1,n){
fp(j,1,m)putchar(s[i][j]);
putchar('\n');
}
return 0;
}
\(D\)
显然会连成一棵树,那么把所有深度大于\(k\)的点取出来,每一次贪心取出深度最大的点,并把它的\(k-1\)次父亲的\(fa\)置为\(1\)就好了
顺便注意\(1\)必须连上自己否则构成的这个环李必然有点不满足条件
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
const int N=1e5+5;
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int dep[N],fa[N],id[N],vis[N],n,k,top,res;
inline bool cmp(const int &x,const int &y){return dep[x]>dep[y];}
void dfs(int u){
if(dep[u]>k)id[++top]=u;
go(u)dep[v]=dep[u]+1,dfs(v);
}
void clr(int u){vis[u]=1;go(u)if(!vis[v])clr(v);}
inline void jump(R int u){fp(i,1,k-1)u=fa[u];clr(u);++res;}
int main(){
scanf("%d%d",&n,&k);
fp(i,1,n)scanf("%d",&fa[i]);
fp(i,2,n)add(fa[i],i);
dfs(1);
sort(id+1,id+1+top,cmp);
fp(i,1,top)if(!vis[id[i]])jump(id[i]);
printf("%d\n",res+(fa[1]!=1));
return 0;
}
\(E\)
果然我的\(dp\)菜的跟什么一样的……
首先把机器人的移动看做出口的移动,那么如果出口往左移动了一格,它在右边就会有一整列不能走,走其他方向同理
那么我们记一个\(dp[u][d][l][r]\)表示分别往四个方向最多走了多少,转移的时候用前缀和优化一下就行了
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
const int N=105;
short f[N][N][N][N],col[N][N],row[N][N],res;
char mp[N][N];int n,m,x,y;
inline int min(R int x,R int y){return x<y?x:y;}
inline int max(R int x,R int y){return x>y?x:y;}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);
fp(i,1,n){
scanf("%s",mp[i]+1);
fp(j,1,m){
if(mp[i][j]=='E')x=i,y=j;
col[i][j]=col[i][j-1]+(mp[i][j]=='o'),
row[i][j]=row[i-1][j]+(mp[i][j]=='o');
}
}
fp(u,0,x-1)fp(d,0,n-x)if(u+d<max(x,n-x+1))
fp(l,0,y-1)fp(r,0,m-y)if(l+r<max(y,m-y+1)){
R short &ret=f[u][d][l][r];
int tl=max(r+1,y-l),tr=min(y+r,m-l),tu=max(d+1,x-u),td=min(x+d,n-u);
if(u+1+d<x)cmax(f[u+1][d][l][r],short(ret+col[x-u-1][tr]-col[x-u-1][tl-1]));
if(d+1+u<=n-x)cmax(f[u][d+1][l][r],short(ret+col[x+d+1][tr]-col[x+d+1][tl-1]));
if(l+1+r<y)cmax(f[u][d][l+1][r],short(ret+row[td][y-l-1]-row[tu-1][y-l-1]));
if(r+1+l<=m-y)cmax(f[u][d][l][r+1],short(ret+row[td][y+r+1]-row[tu-1][y+r+1]));
cmax(res,ret);
}
printf("%d\n",res);
return 0;
}
\(F\)
好麻烦,不写了
AtCoder Grand Contest 004题解的更多相关文章
- AtCoder Grand Contest 004
AtCoder Grand Contest 004 A - Divide a Cuboid 翻译 给定一个\(A*B*C\)的立方体,现在要把它分成两个立方体,求出他们的最小体积差. 题解 如果有一条 ...
- AtCoder Grand Contest 004 C:AND Grid
题目传送门:https://agc004.contest.atcoder.jp/tasks/agc004_c 题目翻译 给你一张网格图,指定的格子是紫色的,要求你构造出两张网格图,其中一张你可以构造一 ...
- [Atcoder Grand Contest 004] Tutorial
Link: AGC004 传送门 A: …… #include <bits/stdc++.h> using namespace std; long long a,b,c; int main ...
- AtCoder Grand Contest 017 题解
A - Biscuits 题目: 给出 \(n\) 个物品,每个物品有一个权值. 问有多少种选取方式使得物品权值之和 \(\bmod\space 2\) 为 \(p\). \(n \leq 50\) ...
- Atcoder Grand Contest 054 题解
那天晚上由于毕业晚会与同学吃饭喝酒没打 AGC,第二天稍微补了下题,目前补到了 E,显然 AGC 的 F 对于我来说都是不可做题就没补了(bushi A 简单题,不难发现如果我们通过三次及以上的操作将 ...
- AtCoder Grand Contest 030题解
第一次套刷AtCoder 体验良好 传送门 Poisonous Cookies cout<<b+min(c,a+b+); Tree Burning 难度跨度有点大啊 可以证明当第一次转向之 ...
- AtCoder Grand Contest 031题解
题面 传送门 题解 比赛的之后做完\(AB\)就开始发呆了--简直菜的一笔啊-- \(A - Colorful\ Subsequence\) 如果第\(i\)个字母选,那么它前面任意一个别的字母的选择 ...
- AtCoder Grand Contest 039 题解
传送门 \(A\) 首先只有一串的情况下,遇到相同的肯定是改后面那一个最优,然后两串的话可能要分奇偶讨论一下 //quming #include<bits/stdc++.h> #defin ...
- AtCoder Grand Contest 017题解
传送门 \(A\) 直接转移就是了 typedef long long ll; const int N=55; ll f[N][2];int a[N],n,p; int main(){ scanf(& ...
随机推荐
- 使用eslint检查代码质量
1.安装 全局安装 npm install eslint -g 局部安装 npm install eslint --save 2.初始化一个配置文件 eslint --init 执行后根据项目需要回答 ...
- WPF 程序如何移动焦点到其他控件
原文:WPF 程序如何移动焦点到其他控件 WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点.本文介绍如何在 ...
- angularjs 中的路由 与 bootstrap标签选项卡的冲突 解决方案
当项目中使用了angularjs 的路由,则所有 像a标签的href 的链接都会走路由,实现页面跳转,那么有些地方需要使用选项卡,就会带来麻烦. 路由使用如下图: 某页面需要使用bootstrap的选 ...
- 使用springboot实现一个简单的restful crud——02、dao层单元测试,测试从数据库取数据
接着上一篇,上一篇我们创建了项目.创建了实体类,以及创建了数据库数据.这一篇就写一下Dao层,以及对Dao层进行单元测试,看下能否成功操作数据库数据. Dao EmpDao package com.j ...
- 【洛谷 P3224】 [HNOI2012]永无乡(Splay,启发式合并)
题目链接 启发式合并就是暴力合并把小的合并到大的里,一个一个插进去. 并查集维护连通性,同时保证并查集的根就是所在Splay的根,这样能省去很多操作. #include <cstdio> ...
- python使用tkinter无法给顶层窗体的输入框设定默认值
这几天某同学遇到了一个棘手的问题,困扰了很久.今天终于解决了,我来记录一下坑. 情景:python 使用tkinter为第二层窗体(顶层窗体)中的一个输入框设定默认值时,总是无法设置,而且对输入框获取 ...
- Java8新特性概览
Java8新特性简介 a)速度更快 1.对于JVM内存模型的新定义,将永久代从堆内存中移除,以前HotSpot JVM堆内存分为三块:1.年轻代 2.年老代 3.持久代 点击回顾 取而代之的是 ...
- MySQL DataType--隐式类型转换
隐式类型转换 在官方文档中对隐式类型转换规则有如下描述: 1. If one or both arguments are NULL, the result of the comparison is N ...
- Python——Str
在Python内存中,字符串是以unicode形式存储的. str格式,最常用的数据类型格式,分别有 (' ') 引号 ,(" ")双引号,(''' ''')三引号 开头和结尾的引 ...
- SQL SERVER-Alwayson原理
流程 1.异步提交模式 主副本无须确认该副本已经完成日志固化,就可提交事务. 主副本不受辅助副本的影响 辅助副本上的DB处于SYNCHRONIZING 2.同步提交模式 主副本要确认副本已经完成日志固 ...