Yahoo Programming Contest 2019 自闭记
A:签到。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int main()
{
int n=read(),m=read();
if (m*2-1<=n) cout<<"YES";else cout<<"NO";
return 0;
}
B:直接按欧拉路判,才不管只有四个点。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int a[5],fa[5];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main()
{
for (int i=1;i<=4;i++) fa[i]=i;
for (int i=1;i<=3;i++)
{
int x=read(),y=read();
a[x]++,a[y]++;fa[find(x)]=find(y);
}
for (int i=1;i<=4;i++)
if (find(i)!=find(1)) {cout<<"NO";return 0;}
int cnt=0;
for (int i=1;i<=4;i++)
{
if (a[i]&1) cnt++;
}
if (cnt==2) cout<<"YES";
else {cout<<"NO";return 0;}
return 0;
}
C:相当于可以用1代价获得1收益,用2代价获得b-a收益。瞎讨论即可。注意2代价获得b-a收益的前提是当前有至少a块饼干。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int main()
{
int n=read(),a=read(),b=read();
b-=a;
if (b<=2) cout<<n+1;
else
{
if (n<a) cout<<n+1;
else
{
n-=a-1;
ll ans=a;
ans+=1ll*b*(n/2);
if (n&1) ans++;
cout<<ans;
}
}
return 0;
}
D:相当于找一个形如0 非零偶数 奇数 非零偶数 0 的序列(每一段长度任意且可以为空),使该序列与原序列差的绝对值之和最小。赛时智商急剧下降搞了一大堆前缀和,最后屯完题交的时候网又卡了,发现wa掉的时候只剩下5min,于是就没救了。实际上直接dp不能再好写,即f[i][0/1/2/3/4]表示第i个位置在第j段中时的最小和。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[N],delta[N];
ll f[N][5];
//ll ans,f[N][2],s[N],g[N][2],h[N];
int main()
{
n=read();
for (int i=1;i<=n;i++) a[i]=read();
/*for (int i=1;i<=n;i++)
if (a[i]==0) delta[i]=2;
else delta[i]=a[i]&1;
for (int i=1;i<=n;i++) g[i][0]=g[i-1][0]+delta[i],s[i]=s[i-1]+a[i];
ll u=0;
for (int i=1;i<=n;i++)
{
u=min(u,s[i]-g[i][0]);
f[i][0]=g[i][0]+u;
}
for (int i=n;i>=1;i--) g[i][1]=g[i+1][1]+delta[i],s[i]=s[i+1]+a[i];
u=0;
for (int i=n;i>=1;i--)
{
u=min(u,s[i]-g[i][1]);
f[i][1]=g[i][1]+u;
}
for (int i=1;i<=n;i++) ans+=a[i];
u=0;
for (int i=1;i<=n;i++) ans=min(ans,f[i][1]+s[i-1]);
for (int i=1;i<=n;i++) h[i]=h[i-1]+(a[i]&1^1);
for (int i=1;i<=n+1;i++)
{
ans=min(ans,f[i][1]+u+h[i-1]);
u=min(u,f[i][0]-h[i]);
}*/
for (int i=1;i<=n;i++)
{
f[i][0]=f[i-1][0];
for (int j=1;j<=4;j++)
f[i][j]=min(f[i][j-1],f[i-1][j]);
f[i][0]+=a[i],f[i][4]+=a[i];
f[i][1]+=a[i]==0?2:(a[i]&1);
f[i][3]+=a[i]==0?2:(a[i]&1);
f[i][2]+=a[i]&1^1;
}
ll ans=f[n][0];for (int i=1;i<=4;i++) ans=min(ans,f[n][i]);
cout<<ans;
return 0;
}
F:大胆猜想序列合法当且仅当序列前i个位置的红球个数<=前i个人的红球个数,序列前i个位置的蓝球个数<=前i个人的蓝球个数,然后就是个思博dp了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 2010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[N],u,v,s[N][2],f[N<<1][N<<1];
char S[N];
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int main()
{
scanf("%s",S+1);
n=strlen(S+1);
for (int i=1;i<=n;i++) a[i]=S[i]-'0';
for (int i=1;i<=n;i++) u+=2-a[i],v+=a[i];
for (int i=1;i<=n;i++) s[i][0]=s[i-1][0]+2-a[i],s[i][1]=s[i-1][1]+a[i];
f[0][0]=1;
for (int i=0;i<=u;i++)
for (int j=0;j<=v;j++)
if (i|j)
{
if (s[min(n,i+j)][0]>=i&&s[min(n,i+j)][1]>=j)
{
if (i) inc(f[i][j],f[i-1][j]);
if (j) inc(f[i][j],f[i][j-1]);
}
}
cout<<f[u][v];
return 0;
}
result:rank 207 rating +38 莫名其妙上黄了但非常不爽啊。
E:当行集合确定后,只要这些行的异或不为0,列的选择方案就有2^(m-1)种(似乎是一个在玛里苟斯中出现过的结论)。子集异或和为0容易想到线性基(高斯消元),同时注意到交换/异或两行不会改变答案,于是高斯消元后得到矩阵的秩,答案就显然了。
Yahoo Programming Contest 2019 自闭记的更多相关文章
- KEYENCE Programming Contest 2019 自闭记
A:签到. #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> ...
- [AtCoder] Yahoo Programming Contest 2019
[AtCoder] Yahoo Programming Contest 2019 很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...
- diverta 2019 Programming Contest 2自闭记
A 签到(a-b problem不用贴了吧,以后atcoder小于300分题均不贴代码) B 发现选择的p,q一定是其中两点间的距离,于是可以O(n2)枚举两点,再O(n2)判断,其实可以做到O(n3 ...
- Yahoo Programming Contest 2019 补题记录(DEF)
D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...
- Yahoo Programming Contest 2019.E.Odd Subrectangles(思路 线性基)
题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵.求任意选出\(r\)行.\(c\)列(共\(2^{n+m}\)种方案),使得这\(r\)行\(c\)列的 ...
- Yahoo Programming Contest 2019.F.Pass(DP)
题目链接 惊了这是什么F题...怎么我都能做出来...以后atcoder的比赛也不能走神了万一有个这样的F呢(CF已有多次了= =) \(f[i][j]\)表示Takahashi现在一共有\(i\)个 ...
- Yahoo Programming Contest 2019.D.Ears(DP)
题目链接 菜爆了啊QAQ 记起点为\(S\),终点为\(T\),走过的最靠左的点是\(L\),最靠右的点是\(R\). 那么坐标轴被分成了五段: \(0\sim L-1\):经过\(0\)次: \(L ...
- Yahoo Programming Contest 2019 E - Odd Subrectangles
E - Odd Subrectangles 思路: 对于行方案固定的情况下,假设和为奇数的列为a个,和为偶数的列为b个,a+b = m 那么从奇数里面选奇数个,即C(a, 1) + C(a, 3) + ...
- Yahoo Programming Contest 2019 F - Pass
F - Pass 思路: dp[i][j] 表示到第 i 个球为止放了 j 个蓝球的方案数 第 i 个球来自的位置的最右边是min(i, n) 转移方程看代码 代码: #pragma GCC opti ...
随机推荐
- ProxySQL+Mysql实现数据库读写分离实战
ProxySQL介绍 ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.具有以下特性:http://www.proxysql.com/ 1.连接池,而且是multiplexing 2 ...
- MySQL 5.7中如何定位DDL被阻塞的问题
在上篇文章<MySQL表结构变更,不可不知的Metadata Lock>中,我们介绍了MDL引入的背景,及基本概念,从“道”的层面知道了什么是MDL.下面就从“术”的层面看看如何定位MDL ...
- 朱晔和你聊Spring系列S1E4:灵活但不算好用的Spring MVC
阅读PDF版本 本文会以一些例子来展现Spring MVC的常见功能和一些扩展点,然后我们来讨论一下Spring MVC好用不好用. 使用SpringBoot快速开始 基于之前的parent模块,我们 ...
- 剑指offer--5.用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: # 栈A用来作入队列# 栈B用来出队列,当栈B为空时,栈A全部出栈到栈B,栈B再出栈(即出队列) v ...
- Python入门-从HelloWorld开始
前言 最近在招聘网上看了许多公司的招聘要求,发现很多公司希望求职者能会Python,特别是一些自动化测试的职位,以前对Python只是介于听说或是一些简单的了解,所以既然市场有需求,那么我们就来学习一 ...
- c++入门之引用
引用通常被用在函数形参传递的过程中.一般的参数传递的过程:将实参进行拷贝,函数中都是对拷贝的变量进行操作,而不是对原变量进行操作.但很多情况下,我们都希望对原变量进行操作.(比如交换两个变量的数值). ...
- Bad Hair Day POJ - 3250 (单调栈入门题)
Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-cons ...
- ElasticSearch 分组查询的几个例子
facets接口可以根据query返回统计数据,其中的 terms_stats 是分组统计,根据key的情况返回value的统计数据,类似group by的意思. "terms_stats& ...
- Win1064位下mysql插入百万行数据耗时问题
performance - Inserting 1 Million records is taking too much time MYSQL - Stack Overflowhttps://stac ...
- day 7-20 视图,触发器,事务
一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...