[AtCoder] Yahoo Programming Contest 2019

  很遗憾错过了一场 AtCoder 。听说这场是涨分场呢,于是特意来补一下题。


A - Anti-Adjacency

  显然 \(K \leq \frac{N + 1}2\)

  1. int n, k;
  2. int main() {
  3. #ifdef hzhkk
  4. freopen("hkk.in", "r", stdin);
  5. #endif
  6. read(n), read(k);
  7. if (k <= (n + 1 >> 1)) puts("YES");
  8. else puts("NO");
  9. }

B - Path

  欧拉路。

  1. const int N = 7;
  2. int n = 4, x, y, deg[N], jcnt;
  3. int main() {
  4. #ifdef hzhkk
  5. freopen("hkk.in", "r", stdin);
  6. #endif
  7. for (int i = 1; i < n; ++i) read(x), read(y), ++deg[x], ++deg[y];
  8. for (int i = 1; i <= n; ++i) if(deg[i] & 1) ++jcnt;
  9. if (jcnt == 0 ||jcnt == 2) puts("YES");
  10. else puts("NO");
  11. }

C - When I hit my pocket...

  如果 \(B-A\leq 2\)的话,那么直接拍饼干肯定不比做交易差。

  否则,就先把饼干数拍到 \(A\) ,然后就卖一次买一次,最后如果还有单独的一次操作机会就拍一下就可以了。

  1. int k, a, b;
  2. int main() {
  3. #ifdef hzhkk
  4. freopen("hkk.in", "r", stdin);
  5. #endif
  6. read(k), read(a), read(b);
  7. if (b - a <= 2) return printf("%d\n", k + 1), 0;
  8. if (k <= a - 1) return printf("%d\n", k + 1), 0;
  9. else{
  10. ll ans = 1;
  11. ans += a - 1; k -= a - 1;
  12. ans += (ll)(k >> 1) * (b - a);
  13. if (k & 1) ++ans;
  14. printf("%lld\n", ans);
  15. }
  16. }

D - Ears

  D题就开始比 A, B, C 有思维啦。

  我们发现在走路的过程中可以一直重复来回走一个格子,这样可以不改变格子的值得奇偶性的情况下,任意改变上面的数。于是,我们联想到奇偶性以后,可以发现,如果我们将走偶数次视为没有走的话,可以发现,这个轨迹最后就是一条直线。也就是说,整个轨迹应该是 偶——奇——偶。

  然后我就很天真地开始写——但是这样例死活过不去。好吧,因为如果想要某个格子走0次的话,就不满足上面的规律了——因为0次需要严格地不走。所以整个轨迹应该是 0——(偶)——(奇)——(偶)——0。其中括号里面的任何一项都可以不存在。

  然后记录一下处在那一段,直接dp就可以了。

  1. const int N = 2e5 + 7;
  2. const ll INF = 0x3f3f3f3f3f3f3f3f;
  3. int n, a[N];
  4. ll dp[N][5], ans = INF;
  5. int main() {
  6. #ifdef hzhkk
  7. freopen("hkk.in", "r", stdin);
  8. #endif
  9. read(n);
  10. for (int i = 1; i <= n; ++i) read(a[i]);
  11. dp[0][1] = dp[0][2] = dp[0][3] = dp[0][4] = INF;
  12. for (int i = 1; i <= n; ++i) {
  13. dp[i][0] = dp[i - 1][0] + a[i];
  14. dp[i][1] = std::min(dp[i - 1][0], dp[i - 1][1]) + (a[i] ? (a[i] & 1) : 2);
  15. dp[i][2] = std::min(std::min(dp[i - 1][1], dp[i - 1][2]), dp[i - 1][0]) + (a[i] & 1 ^ 1);
  16. dp[i][3] = std::min(dp[i - 1][2], dp[i - 1][3]) + (a[i] ? (a[i] & 1) : 2);
  17. dp[i][4] = std::min(std::min(dp[i - 1][1], dp[i - 1][2]), std::min(dp[i - 1][3], dp[i - 1][4])) + a[i];
  18. }
  19. for (int i = 0; i < 5; ++i) SMIN(ans, dp[n][i]);
  20. printf("%lld\n", ans);
  21. }

E - Odd Subrectangles

  我个人感觉这道题是这一场里面最难的,比F还要难。我一开始想dp,但是发现好像不太行。然后想了半天想不出来,只能看了一眼题解的前几句话。直接把那两句话复制过来吧。

  ”如果选的行数确定了,那么选某一列的奇偶性也会确定。“主要get到假设选的行先确定的思路。

  然后继续推,那么想要让选的列加起来的奇偶性为偶数,那么只能选奇数个和是奇数列,和是偶数的随便选多少。

  那么我们假设有 \(a\) 个偶数列, \(b\) 个奇数列。那么就是选的列的方案数就是 \(且是奇数2^a \cdot \sum \limits_{i\leq b\text{且}i是奇数}{C_b^{i}} = 2^a \cdot 2^{b-1} = 2^{m-1}\)。所以不管怎么选行,对应的列的方案数总是 \(2^{m-1}\) ——但是,\(b\) 如果是 \(0\) 的话,那么没办法选奇数个奇数列了!那么也就是说,如果我们把一行看做一个数,那么我们选的这些行的异或和不应该为 \(0\)!

​ 那么异或和不为 \(0\) 的方案数就是线性基的套路了。证明可以自己百度,也很简单,这里给出结论:如果线性基的大小是\(r\) ,原序列的长度为 \(n\),那么异或和不为 \(0\) 的方案数为 \(2^n - 2^{n-r}\)。

  1. const int N = 300 + 7;
  2. const int P = 998244353;
  3. int n, m, a[N][N], b[N][N], r;
  4. inline int fpow(int x, int y) {
  5. int ans = 1;
  6. for (; y; y >>= 1, x = (ll)x * x % P) if (y & 1) ans = (ll)ans * x % P;
  7. return ans;
  8. }
  9. int main() {
  10. #ifdef hzhkk
  11. freopen("hkk.in", "r", stdin);
  12. #endif
  13. read(n), read(m);
  14. for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) read(a[i][j]);
  15. for (int i = 1; i <= n; ++i){
  16. for (int j = 1; j <= m; ++j)
  17. if (a[i][j])
  18. if (!b[j][j]) {
  19. for (int k = 1; k <= m; ++k) b[j][k] = a[i][k];
  20. ++r;
  21. break;
  22. } else for (int k = 1; k <= m; ++k) a[i][k] ^= b[j][k];
  23. }
  24. printf("%lld\n", (ll)fpow(2, m - 1) * (fpow(2, n) + P - fpow(2, n - r)) % P);
  25. }

F - Pass

  对于问序列的方案数的题目的套路,一般是考虑直接构造序列,考虑这个序列需要满足的特征。

  发现对于序列的前 \(i\) 项(\(1 \leq i \leq n\) 也就是说不包括后 \(n\) 项),他能拿到的球一定只能来自前 \(i\) 个人。这样的话,红球和蓝球的数量都有了上限,也同时因为对方的上限也有了下限。

  这样的话就是 dp 的裸题了。设 \(dp[i][j]\) 表示前 \(i\) 步,拿了 \(j\) 个蓝球的方案数,讨论这一部拿红球还是蓝球转移一下就好了。

  1. const int N = 2000 + 7;
  2. const int P = 998244353;
  3. int n, cntb[N << 1], dp[N << 1][N << 1];
  4. char s[N];
  5. inline void Inc(int &x, int y) {x += y; x >= P ? x -= P : 0;}
  6. int main() {
  7. #ifdef hzhkk
  8. freopen("hkk.in", "r", stdin);
  9. #endif
  10. scanf("%s", s + 1); n = strlen(s + 1);
  11. for (int i = 1; i <= n; ++i) cntb[i] = cntb[i - 1] + s[i] - '0';
  12. for (int i = n + 1; i <= (n << 1); ++i) cntb[i] = cntb[i - 1];
  13. dp[0][0] = 1;
  14. for (int i = 1; i <= (n << 1); ++i) {
  15. for (int j = std::max(cntb[i] - i, 0); j <= std::min(cntb[i], i); ++j) {
  16. if (j) dp[i][j] = dp[i - 1][j - 1];
  17. if (i > j) Inc(dp[i][j], dp[i - 1][j]);
  18. // dbg("dp[%d][%d] = %d\n", i, j, dp[i][j]);
  19. }
  20. }
  21. printf("%d\n", dp[n << 1][cntb[n]]);
  22. }

[AtCoder] Yahoo Programming Contest 2019的更多相关文章

  1. Atcoder Yahoo Programming Contest 2019 简要题解

    A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...

  2. [AtCoder] NIKKEI Programming Contest 2019 (暂缺F)

    [AtCoder] NIKKEI Programming Contest 2019   本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder ...

  3. 【AtCoder】Yahoo Programming Contest 2019

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

  4. AtCoder NIKKEI Programming Contest 2019 C. Different Strokes (贪心)

    题目链接:https://nikkei2019-qual.contest.atcoder.jp/tasks/nikkei2019_qual_C 题意:给出 n 种食物,Takahashi 吃下获得 a ...

  5. Yahoo Programming Contest 2019 补题记录(DEF)

    D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...

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

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

  7. AtCoder NIKKEI Programming Contest 2019 E. Weights on Vertices and Edges (并查集)

    题目链接:https://atcoder.jp/contests/nikkei2019-qual/tasks/nikkei2019_qual_e 题意:给出一个 n 个点 m 条边的无向图,每个点和每 ...

  8. Yahoo Programming Contest 2019 自闭记

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

  9. atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges

    题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...

随机推荐

  1. 一些比较好的blogs

    01Trie水过普通平衡树 MinMax容斥 Trie与可持久化Trie 圆方树 CDQ分治 网络流 有上下界的网络流 Mobius函数 组合数学盒子小球 dsu on tree VFK大爷的反演课件 ...

  2. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  3. 2017华南理工华为杯D bx回文

    比赛的时候队友过了,补补题XD. 题目链接:https://scut.online/p/125(赛后补题) 125. 笔芯回文     题目描述 bx有一个长度一个字符串S,bx可以对其进行若干次操作 ...

  4. php面试专题---16、MySQL创建高性能索引考点

    php面试专题---16.MySQL创建高性能索引考点 一.总结 一句话总结: 注意:只写精品 1.索引的基础? 类似书籍的目录:索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录 ...

  5. Python分析《武林外传》

    我一向比较喜欢看武侠电影.小说,但是06年武林外传开播的时候并没有追剧,简单扫几眼之后发现他们都不会那种飞来飞去的打,一点也不刺激.09年在南京培训的时候,日子简单无聊透顶,大好的周末不能出门,只能窝 ...

  6. scrapy xpath xpath('---').xpath('string(.)') 提取子元素全部文本

    product.xpath("div//div[@class='a-row a-spacing-mini'][1]/div[2]").xpath('string(.)')

  7. STM32 I2C 难点---这个不错,留着慢慢研究

    来自:http://bbs.ednchina.com/BLOG_ARTICLE_2154168.HTM I2C 总线在所有嵌入式系统中用得极广, 是一个工业级别的总线, 但由于STM32 是一个32位 ...

  8. HTML--JS 获取选择框信息

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 炫酷CSS3加载动画

    <!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8&qu ...

  10. 03 - Jmeter用户自定义变量CSV参数化以及断言的设置

    设置断言 咱们还是先看一个图吧,由下图可以看出接口是请求成功了,但是请求数量比较少,还是比较方便看的,但是jmeter既然是压测工具,那么肯定不会发这么点儿请求的,如果请求数量比较庞大的话,我们仅仅凭 ...