D - Ears

题目链接:D - Ears

大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯。每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在\(i\)的位置放置一个石子。现在给出最后的石子序列,但这个序列有可能是不合法的,定义一次操作是将第\(i\)个位置上记录的石子\(-1\)或\(+1\),求最少的操作数使得给定序列成为一个合法序列

分析:

我们记录一次行走的起点为\(S\),终点为\(T\),在这次行走中到达的最左边的点为\(L\),最右边的点为\(R\)

那么这四个点将坐标轴分成了五个部分

(1):\(0\text~L-1\),\(A_i=0\)

(2):\(L\text~S-1\),\(A_i\)为偶数(可以为0)

(3):\(S\text ~T\),\(A_i\)为奇数

(4):\(T+1\text~ R\),\(A_i\)为偶数(可以为0)

(5):\(R+1\text~ INF\),\(A_i=0\)

那么我们可以进行dp,记\(dp[i][j]\)表示在第\(i\)号格子中时属于第\(j\)个部分

每一次从\(i-1\)号格子中的\(\leq j\)的部分的最小值转移而来

注意在2,3,4部分中,如果\(A_i=0\)的话任然需要计算花费(为了到达下一个部分)

似乎可以滚动数组优化(但是懒qwq)

  1. #include<iostream>
  2. #include<string.h>
  3. #include<string>
  4. #include<stdio.h>
  5. #include<algorithm>
  6. #include<math.h>
  7. #include<vector>
  8. #include<queue>
  9. #include<map>
  10. using namespace std;
  11. const int maxd=1000000007,N=100000;
  12. const double pi=acos(-1.0);
  13. typedef long long ll;
  14. int n;
  15. ll a[200200],dp[200200][5];
  16. int read()
  17. {
  18. int x=0,f=1;char ch=getchar();
  19. while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
  20. while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
  21. return x*f;
  22. }
  23. int main()
  24. {
  25. n=read();int i;
  26. for (i=1;i<=n;i++) a[i]=read();
  27. for (i=1;i<=n;i++)
  28. {
  29. ll mind=dp[i-1][0];
  30. dp[i][0]=dp[i-1][0]+a[i];
  31. mind=min(mind,dp[i-1][1]);
  32. if (a[i]) dp[i][1]=mind+(a[i]%2);else dp[i][1]=mind+2;
  33. mind=min(mind,dp[i-1][2]);
  34. if (a[i]) dp[i][2]=mind+((a[i]+1)%2);else dp[i][2]=mind+1;
  35. mind=min(mind,dp[i-1][3]);
  36. if (a[i]) dp[i][3]=mind+(a[i]%2); else dp[i][3]=mind+2;
  37. mind=min(mind,dp[i-1][4]);
  38. dp[i][4]=mind+a[i];
  39. }
  40. ll ans=min(min(dp[n][2],dp[n][3]),dp[n][4]);
  41. printf("%lld",ans);
  42. return 0;
  43. }

E - Odd Subrectangles

题目链接:E - Odd Subrectangles

大意:给出一个\(n\)行\(m\)列的01矩阵,你可以选定一个行集合和列集合,使得那些行数和列数均在对应集合的矩阵中的位置上的数字之和是奇数,求方案数(感觉翻译的好奇怪啊QAQ,算了意思到了(逃)

分析:

将问题转化,“和为奇数”等价于“异或和为1”

将每一行都视作一个数(\(< 2^m\)),我们考虑已经选择了任意的\(i\)行

首先如果说我们选定的这\(i\)行的异或之和为0的话,无论我们怎么选择列,选定格子的异或之和均为0

所以此时对应的方案数为0

那么如果这\(i\)行的异或和不为0的话,就说明是01交杂的

我们假设最后的异或和存在\(a\)个\(1\)和\(b\)个\(0\),那么首先就有\(a+b=m\)

同时要使所有选择的格子异或之和为奇数的话,那么我们一定会选择奇数个\(1\),而\(0\)的个数是任意的

选择\(1\)的方案数:\(C^1_a+C^3_a+\cdots+C^a_a(a\text%2=1)(或C_a^{a-1}当a\text%2=0)=2^{a-1}\)

(利用二项式定理和组合数的递推证明)

选择\(0\)的方案数:\(2^b\)

所以对于这\(i\)行而言合法的选择方案为\(2^{a-1}*2^b=2^{a+b-1}=2^{m-1}\)

我们发现,无论\(i\)的值是多少以及我们如何选取这\(i\)行,最后选取的列的方案数是一定的

由于异或和不为\(0\)的方案数=总方案数-异或和为0的方案数

所以\(ans=(2^n-行异或和为0的方案数)*2^{m-1}\)

行异或和的方案数可以用\(bitset+\)线性基完成,记最后被赋了值的线性基总数为\(x\)

则\(ans=(2^n-2^{n-r})*2^{m-1}\)(对于剩下的\(n-r\)个未被插入线性基的数,我们可以选取它和可以表示它的线性基里面的数)

直接预处理2的幂次即可

  1. #include<iostream>
  2. #include<string.h>
  3. #include<string>
  4. #include<stdio.h>
  5. #include<algorithm>
  6. #include<math.h>
  7. #include<vector>
  8. #include<queue>
  9. #include<bitset>
  10. #include<map>
  11. using namespace std;
  12. const int maxd=998244353,N=100000;
  13. const double pi=acos(-1.0);
  14. typedef long long ll;
  15. int n,m,cnt=0;
  16. ll bin[320];
  17. bitset<320> a[320],p[320];
  18. int read()
  19. {
  20. int x=0,f=1;char ch=getchar();
  21. while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
  22. while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
  23. return x*f;
  24. }
  25. int main()
  26. {
  27. n=read();m=read();
  28. int i,j;
  29. bin[0]=1;
  30. for (i=1;i<=300;i++) bin[i]=(bin[i-1]*2)%maxd;
  31. for (i=1;i<=n;i++)
  32. {
  33. for (j=1;j<=m;j++)
  34. {
  35. int tmp=read();
  36. if (tmp) a[i][j]=1;
  37. }
  38. }
  39. for (i=1;i<=n;i++)
  40. {
  41. for (j=1;j<=m;j++)
  42. {
  43. if (a[i][j])
  44. {
  45. if (p[j][j]) a[i]^=p[j];
  46. else
  47. {
  48. p[j]=a[i];
  49. cnt++;
  50. break;
  51. }
  52. }
  53. }
  54. }
  55. ll ans=(((bin[n]-bin[n-cnt])*bin[m-1])%maxd+maxd)%maxd;
  56. printf("%lld",ans);
  57. return 0;
  58. }

F - Pass

题目链接:F - Pass

题目大意:\(n\)个人站成一排,开始时每个人手上有两个球(红色或蓝色),在每一个时刻第\(i\)个人如果手上有球就随机把一个球传给第\(i-1\)个人,第\(1\)个人传给小明,小明记录下球的颜色,问最后有可能记录下的球的颜色序列有多少种?

难得F比E还简单(虽然我没有做出来)

预处理\(1-i\)个人手上有几个红球几个蓝球

记\(dp[i][j]\)表示已经记录了\(i\)个球的颜色,其中\(j\)个是红球

转移十分显然:\(dp[i][j]=dp[i-1][j]+dp[i-1][j-1]\)

注意一下当前的红球数为\(j\),蓝球数为\(i-j\)

而在枚举\(i​\)的时候红球和蓝球个数均有一个上界,不能超过这个上界

同时\(j-1\geq 0\)即可

\(ans=dp[2*n][红球个数]\)

  1. #include<iostream>
  2. #include<string.h>
  3. #include<string>
  4. #include<stdio.h>
  5. #include<algorithm>
  6. #include<math.h>
  7. #include<vector>
  8. #include<queue>
  9. #include<map>
  10. using namespace std;
  11. const int maxd=998244353,N=100000;
  12. const double pi=acos(-1.0);
  13. typedef long long ll;
  14. int n,sumr[3030],sumb[3030],dp[4060][4060];
  15. char s[3030];
  16. int read()
  17. {
  18. int x=0,f=1;char ch=getchar();
  19. while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
  20. while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
  21. return x*f;
  22. }
  23. int main()
  24. {
  25. scanf("%s",s+1);
  26. int i,j;n=strlen(s+1);
  27. sumr[0]=0;sumb[0]=0;
  28. for (i=1;i<=n;i++)
  29. {
  30. sumr[i]=sumr[i-1];sumb[i]=sumb[i-1];
  31. if (s[i]=='0') sumr[i]+=2;
  32. else if (s[i]=='1') {sumr[i]++;sumb[i]++;}
  33. else if (s[i]=='2') sumb[i]+=2;
  34. }
  35. //for (i=1;i<=n;i++) cout << sumr[i] << " ";cout << endl;
  36. //for (i=1;i<=n;i++) cout << sumb[i] << " ";cout << endl;
  37. dp[0][0]=1;
  38. for (i=1;i<=2*n;i++)
  39. {
  40. int nowr=sumr[min(i,n)],nowb=sumb[min(i,n)];
  41. for (j=0;j<=i;j++)
  42. {
  43. if ((nowr>=j) && (nowb>=i-j))
  44. {
  45. dp[i][j]=dp[i-1][j];
  46. if (j>0) dp[i][j]=(dp[i][j]+dp[i-1][j-1])%maxd;
  47. }
  48. }
  49. }
  50. printf("%lld",dp[2*n][sumr[n]]);
  51. return 0;
  52. }

每次做AtCoder的题都能感觉到自己的渺小

Yahoo Programming Contest 2019 补题记录(DEF)的更多相关文章

  1. [AtCoder] Yahoo Programming Contest 2019

    [AtCoder] Yahoo Programming Contest 2019   很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...

  2. 【AtCoder】Yahoo Programming Contest 2019

    A - Anti-Adjacency K <= (N + 1) / 2 #include <bits/stdc++.h> #define fi first #define se se ...

  3. Yahoo Programming Contest 2019 自闭记

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

  4. Yahoo Programming Contest 2019.F.Pass(DP)

    题目链接 惊了这是什么F题...怎么我都能做出来...以后atcoder的比赛也不能走神了万一有个这样的F呢(CF已有多次了= =) \(f[i][j]\)表示Takahashi现在一共有\(i\)个 ...

  5. Yahoo Programming Contest 2019.E.Odd Subrectangles(思路 线性基)

    题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵.求任意选出\(r\)行.\(c\)列(共\(2^{n+m}\)种方案),使得这\(r\)行\(c\)列的 ...

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

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

  7. Yahoo Programming Contest 2019 E - Odd Subrectangles

    E - Odd Subrectangles 思路: 对于行方案固定的情况下,假设和为奇数的列为a个,和为偶数的列为b个,a+b = m 那么从奇数里面选奇数个,即C(a, 1) + C(a, 3) + ...

  8. Yahoo Programming Contest 2019 F - Pass

    F - Pass 思路: dp[i][j] 表示到第 i 个球为止放了 j 个蓝球的方案数 第 i 个球来自的位置的最右边是min(i, n) 转移方程看代码 代码: #pragma GCC opti ...

  9. Yahoo Programming Contest 2019 D - Ears

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

随机推荐

  1. javaMail发邮件,激活用户账号

    用javamail实现注册用户验证邮箱功能.用户注册后随机生成一个uuid作为用户的标识,传递给用户然后作为路径参数.发送html的内容到用户注册的邮箱里,若用户点击后去往的页面提交username和 ...

  2. PS调出清新淡雅外景女生背影照

    首先,依然是前期事项. 这套图是八月份下午三点多在草地上拍的(好像标题的秋日欺骗了大众XD),阳光很烈,不过也因为这样,能拍出比较清新的蓝天.用的是腾龙70-200 2.8VC拍摄,长焦在拍这种空旷大 ...

  3. win64位安装python-mysqldb1.2.3

    在其他版本的mysqldb里面时间查询有问题最后确定还是在 1.2.5 版本下来解决,需要解决的问题就是这个:“Cannot open include file: 'config-win.h': No ...

  4. 在IDEA中配置Spring的XML装配

    不考虑混合模式的话,Spring有三类装配Bean的方法,自动装配和Java代码装配都会很容易上手,但在弄XML装配时遇到了问题,这与IDEA环境有关. 装配时需要在源码中配置XML文件的位置,我看别 ...

  5. 解决远程连接mysql很慢的方法(网络正常)

    最近用mysql命令行或者JDBC远程连接mysql速度很慢,而且远大于ping时间.上网搜了一下,解决方案如下: 在/etc/mysql/my.cnf文件的[mysqld]部分加入:skip-nam ...

  6. 持续集成之Jenkins自动部署war包到远程服务器

    一.无war包链接的情况 无war包链接时,需先下载war包到本地,然后执行: ---------------------------------------------以下部分为转载-------- ...

  7. gin框架学习手册

    前言 gin框架是go语言的一个框架,框架的github地址是:https://github.com/gin-gonic/gin 转载本文,请标注原文地址:https://www.cnblogs.co ...

  8. Python技术之书籍汇总

    近日,一直在学习Python,发现有关的书籍还是很多值得一读的,所以在此总结一下.以后慢慢去研读吧!!! Python入门 <Python编程快速上手——让繁琐工作自动化> 作者: [美] ...

  9. scoketio

    服务器代码let net = require('net'); // 创建服务器 let server = net.createServer(); // 定义一个数组 ,存放每一个连接服务器的客户端用户 ...

  10. C#设计模式之2:单例模式

    在程序的设计过程中很多时候系统会要求对于某个类型在一个应用程序域中只出现一次,或者是因为性能的考虑,或者是由于逻辑的要求,总之是有这样的需求的存在,那在设计模式中正好有这么一种模式可以来满足这样的要求 ...