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;
}

转载于:https://www.cnblogs.com/cjfdf/p/10358465.html

Atcoder Yahoo Programming Contest 2019 简要题解相关推荐

  1. Yahoo Programming Contest 2019 F - Pass

    传送门 题目大意 给定一个只包含012序列,0表示这个人有2个红球,1表示一个红球一个蓝球,2表示两个蓝球.进行n*2次游戏,每次游戏所有有球的人选择一个球递给前一个人,第一个人把球放到一个序列中,' ...

  2. Yahoo Programming Contest 2019 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  3. Yahoo Programming Contest 2019 E - Odd Subrectangles

    E - Odd Subrectangles 链接 题意: n*m的01矩阵,选出一些行和一些列,计算多少个选的方式,使得相交的点的权值和,是奇数,n,m<=300. 分析: 考虑选出了行,有多少 ...

  4. Yahoo Programming Contest 2019 D - Ears

    D - Ears 思路: s:起点           t:终点           l:左端点           r:右端点 以上称为关键点 dp[i][j]表示到位置 i 为止,已经经过前 j ...

  5. Yahoo Programming Contest 2019 D-Ears

    传送门 题目大意 分析 我们不难整个线段可以被划分为5段 我们设路径到达的最左的地方是L,最右的地方是R 则这五段分别是0~L,L+1~S,S+1~T,T+1~R,R+1~N 最外面的两端不经过,所以 ...

  6. Yahoo Programming Contest 2019.D.Ears(DP)

    题目链接 菜爆了啊QAQ 记起点为\(S\),终点为\(T\),走过的最靠左的点是\(L\),最靠右的点是\(R\). 那么坐标轴被分成了五段: \(0\sim L-1\):经过\(0\)次: \(L ...

  7. Atcoder Keyence Programming Contest 2020 D - Swap and Flip

    Atcoder Keyence Programming Contest 2020 D - Swap and Flip 题目描述 Solution 写了一个简单的O(2nn(n+w))O(2^nn(n+ ...

  8. Atcoder Panasonic Programming Contest 2020 B Bishop 周期性+难在特判

    Panasonic Programming Contest 2020   比赛人数6617   慢,比赛开始后10分钟才看到题目,比赛题目比ABC要灵活些 Atcoder Panasonic Prog ...

  9. Programming Contest Ranking(题解)

    Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...

最新文章

  1. 算法分析与设计之多处最优服务次序问题2
  2. Keepalived配置与使用--转载
  3. 数据库开发——MySQL——foreign key
  4. 生成对抗网络gan原理_必读!TOP10生成对抗网络GAN论文(附链接)
  5. [js] js的循环结构有哪些?
  6. Codeforces 757B - Bash's Big Day(分解因子+hashing)
  7. poj3176 基础的动态规划算法 挑战程序设计竞赛
  8. 如何调整金格电子章服务器印章_电子签章赋能勘察设计新动力
  9. HDU1412 {A} + {B}【排序+集合合并】
  10. 看了这份《算法中文手册》笔记,就再也不怕字节了~
  11. matlab 加随机数,随机数加上100:Matlab
  12. talib 安装的问题
  13. c51汇编语言循环指令,汇编语言循环指令loop
  14. Spring Cloud Netflix之Euraka Server注册中心
  15. php 汉王云名片_汉王云名片识别(SM)组件开发详解
  16. 微信小程序自定义map组件标记点markers(兼容苹果和安卓)
  17. pythonrefprop怎么设置_Refprop调用Excel设置步骤
  18. B站这场跨年晚会价值60亿,凭啥?
  19. MQTT协议详解 三、MQTT控制包(CONNECT)
  20. dac 矩形波函数c语言,使用DAC接口生成矩形波

热门文章

  1. 用java编写圆锥_求java大神帮忙 求大神帮助!Java
  2. java创建response对象_javaweb入门-----request与response的作用
  3. git restore
  4. Flink WatermarkKeyed
  5. javascript Element对象
  6. Python RSA
  7. shell 循环控制语句
  8. Pandas 基本文本数据处理
  9. Oracle的order by关键字
  10. adobe怎么统计字数_统计数据显示,6 月份桌面 Linux 市场份额攀升至历史新高 | Linux 中国...