Atcoder Yahoo Programming Contest 2019 简要题解
A-C
直接放代码吧。
A
int n,k;
int main()
{
n=read();k=read();
puts(k<=(n+1)/2?"YES":"NO");
return 0;
}
B
int d[N];pair<int,int>s[10];
int main()
{
for(int i=1,u,v;i<=3;i++){
u=read();v=read();
s[i].first=u;s[i].second=v;
d[u]++;d[v]++;
}
sort(s+1,s+3+1);
for(int i=2;i<=3;i++)if(s[i]==s[i-1])return puts("NO"),0;
for(int i=1;i<=4;i++)if(d[i]>=3)return puts("NO"),0;
return puts("YES"),0;
}
C
int main()
{
int k=read(),a=read(),b=read();ll ans=0;
if(b<=a+2||k<=a-1)printf("%d\n",k+1);
else{
k-=a-1;ans=a;if(k&1)k--,ans++;
printf("%lld\n",ans+1ll*(k/2)*(b-a));
}
return 0;
}
D - Ears
zsy在一条\([0,L]\)的数轴上来回走路。
zsy可以任选\([0,L]\)中的整点作为起点和终点,并且zsy走路时只能在整数位置(\(0,1,2,...,L\))调整方向。
每当zsy向左或向右经过一条\([i,i+1]\ (i\in[0,L))\)的线段时,zsy就会往这条线段的中间放上一个球。
当zsy走完路后,yyb会来到这条数轴。她会进行若干次操作:打爆一个球或在一条线段的中间放上一个球。
现在给出数轴每条线段中间最终球的个数\(a_1,...,a_n\),求出zsy的一种行走方式,使得yyb的操作次数最小。
因为zsy可以反复横跳来回地走,所以可以把\(a_i\)减去若干个2,最后只剩下\(0,1,2\)三种状态。
可以知道对应简化数组的一种最优方案里zsy不会重复走过一条路超过2次。
既然是回路问题,考虑插头dp。
设\(f[i][j][k]\)表示考虑轮廓线到达\(i\),插头有\(j\)个,已经用了\(k\)个单插头的最少代价,
直接转移即可。
int n,t[N];ll suft[N],dp[N][3][3],ans;
inline void upd(ll &a,ll b){a=a<b?a:b;}
inline int calc(int x,int r){
if(r==0)return x;
if(r==1)return x&1?0:1;
if(r==2){if(!x)return 2;else return x&1?1:0;}
}
int main()
{
n=read();for(int i=1;i<=n;i++)t[i]=read();
for(int i=n;i;i--)suft[i]=suft[i+1]+t[i];ans=suft[1];
memset(dp,63,sizeof(dp));dp[0][0][0]=0;
for(int i=0;i<=n;i++)
for(int a=0;a<3;a++)
for(int b=0;b<3;b++){
if(a==0){
upd(dp[i+1][a][b],dp[i][a][b]+t[i+1]);
if(b!=2)upd(dp[i+1][a+1][b+1],dp[i][a][b]+calc(t[i+1],1));
upd(dp[i+1][a+2][b],dp[i][a][b]+calc(t[i+1],2));
}
if(a==1){
if(b!=2)upd(ans,dp[i][a][b]+suft[i+1]);
upd(dp[i+1][a][b],dp[i][a][b]+calc(t[i+1],1));
if(b!=2)upd(dp[i+1][a+1][b+1],dp[i][a][b]+calc(t[i+1],2));
}
if(a==2){
upd(ans,dp[i][a][b]+suft[i+1]);
if(b!=2)upd(dp[i+1][a-1][b+1],dp[i][a][b]+calc(t[i+1],1));
upd(dp[i+1][a][b],dp[i][a][b]+calc(t[i+1],2));
}
}
printf("%lld\n",ans);
return 0;
}
E - Odd Subrectangles
考虑给定行后选出列集合的方案数:
如果行的异或和不为0,那么总有一半的方案选出来异或和为1,另一半为0,因此方案为\(2^{m-1}\)
于是答案变成\(2^{m-1}S\),其中\(S\)表示行向量选出来的异或和不为\(0\)的方案数。
求解选取行向量集合,使其异或和不为0的方案数是一个经典问题:
考虑求出\(n\)个行向量的线性基,设其大小为\(r\)。
如果仅选取线性基中的元素,显然无法使得异或和为\(0\);
那么考虑先选取不在线性基中的元素:
对于这样的一组方案,在线性基中都有唯一的一种选取元素的方案,使得所有元素的异或和为0.
因此\(S=2^n-2^{n-r}\)。
int n,m,a[N][N],now[N],in[N],p[N][N],r;
inline int poww(int a,int b){
int res=1;
for(;b;b>>=1,a=1ll*a*a%mod)
if(b&1)res=1ll*res*a%mod;
return res;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)a[i][j]=read();
for(int i=1;i<=n;i++){
memcpy(now,a[i],sizeof(now));
for(int j=1;j<=m;j++)
if(now[j]){
if(in[j])for(int k=j;k<=m;k++)now[k]^=p[j][k];
else{in[j]=1;memcpy(p[j],now,sizeof(p[j]));r++;break;}
}
}
printf("%lld\n",1ll*(poww(2,n)-poww(2,n-r)+mod)%mod*poww(2,m-1)%mod);
return 0;
}
F - Pass
考虑直接构造最终序列。由传球方式可以知道,第\(i(i\le n)\)个球只会在\(1-i\)个人的手中出现,后\(n\)个求随意。
因此直接设\(f[i][j]\)dp,最后组合数乘一下即可。
char s[N];int n,dp[N][N],c[N][N],ans;
inline void upd(int &a,int b){a+=b;if(a>=mod)a-=mod;}
int main()
{
scanf("%s",s+1);n=strlen(s+1);
for(int i=0;i<=n;i++)
for(int j=c[i][0]=1;j<=i;j++)upd(c[i][j]=c[i-1][j],c[i-1][j-1]);
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0,c=s[i]-48;j<=i;j++){
if(j>=c-1)upd(dp[i][j],dp[i-1][j-c+1]);
if(j>=c)upd(dp[i][j],dp[i-1][j-c]);
}
for(int i=0;i<=n;i++)upd(ans,1ll*dp[n][i]*c[n][i]%mod);
printf("%d\n",ans);
return 0;
}
Atcoder Yahoo Programming Contest 2019 简要题解的更多相关文章
- [AtCoder] Yahoo Programming Contest 2019
[AtCoder] Yahoo Programming Contest 2019 很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...
- [AtCoder] NIKKEI Programming Contest 2019 (暂缺F)
[AtCoder] NIKKEI Programming Contest 2019 本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder ...
- 【AtCoder】Yahoo Programming Contest 2019
A - Anti-Adjacency K <= (N + 1) / 2 #include <bits/stdc++.h> #define fi first #define se se ...
- AtCoder NIKKEI Programming Contest 2019 C. Different Strokes (贪心)
题目链接:https://nikkei2019-qual.contest.atcoder.jp/tasks/nikkei2019_qual_C 题意:给出 n 种食物,Takahashi 吃下获得 a ...
- AtCoder NIKKEI Programming Contest 2019 E. Weights on Vertices and Edges (并查集)
题目链接:https://atcoder.jp/contests/nikkei2019-qual/tasks/nikkei2019_qual_e 题意:给出一个 n 个点 m 条边的无向图,每个点和每 ...
- Yahoo Programming Contest 2019 补题记录(DEF)
D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...
- Yahoo Programming Contest 2019.F.Pass(DP)
题目链接 惊了这是什么F题...怎么我都能做出来...以后atcoder的比赛也不能走神了万一有个这样的F呢(CF已有多次了= =) \(f[i][j]\)表示Takahashi现在一共有\(i\)个 ...
- Yahoo Programming Contest 2019 自闭记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges
题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...
随机推荐
- Python输出格式全总结
输入输出 有几种方法可以显示程序的输出:数据可以以人类可读的形式打印出来,或者写入文件以供将来使用.本章将讨论一些可能性. 更漂亮的输出格式 到目前为止,我们遇到了两种写入值的方法:表达式语句 和 p ...
- 006 --MySQL索引原理
一 .索引的概念? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化 ...
- 【坚持】Selenium+Python学习之从读懂代码开始 DAY7
2018/05/25 EC [EC](https://github.com/easonhan007/webdriver_guide/blob/master/34/expected_conditions ...
- java事物详解
一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (iso ...
- CHAPTER 25 The Greatest Show on Earth 第25章 地球上最壮观的演出
CHAPTER 25 The Greatest Show on Earth 第25章 地球上最壮观的演出 Go for a walk in the countryside and you will f ...
- xocde missing file 解决方法
创建一个警告里丢失的文件 托到警报的目录下 重启xcode 警告消失 在xcode中选中这个文件右键delete再次删掉文件,就OK了.
- resize2fs命令详解
基础命令学习目录首页 原文链接:http://blog.51cto.com/woyaoxuelinux/1870299 resize2fs:调整ext文件系统的空间大小 搭配逻辑卷lv使用方法: ...
- python判断文件和文件夹是否存在、没有则创建文件夹
原文出处:https://www.cnblogs.com/hushaojun/p/4533241.html >>> import os >>> os.path.ex ...
- python实现将json数据以json格式写入txt文件
json.dumps中indent参数是设置json缩进量的 举例: tmp = { "aaa" : "111", "bbb" : '222 ...
- C++ 类 构造函数 constructor
构造函数 当定义了一个整型变量: int a; 这会申请了一块内存空间来存储a,但是这块内存中原本有数据的,可能是任何值,这不是你所希望的,若你就希望a表示1,所以要把a的值赋值为1. ; 例: #i ...