首页 > 其他分享 >Educational Codeforces Round 151

Educational Codeforces Round 151

时间:2023-07-19 23:44:59浏览次数:35  
标签:151 Educational ch int Codeforces 40 奇偶性 mod 个球

AB

C(简)

将密码 \(P\) 与 \(S\) 进行匹配,按顺序决定 \(P_i\),为了避免 \(P\) 成为 \(S\) 的子串,每次贪心地选择当前匹配位置最靠后的。若出现匹配不上则“YES”。

D

有点意思。从基础的情况入手:

设 \(\{s_i\}\) 为 \(\{a_i\}\) 的前缀和,弄出 \(\{s_i\}\) 的图像,让我们考虑第一个山峰(极大值)\(s_x\)。显然,若 \(k<s_x\),最后的结果不会优于 \(k=s_x\),因为一口气就爬到 \(s_x\) 了,在下面挡不如在 \(s_x\) 挡掉的多。

已知 \(k\geq s_x\),找到下一座比 \(s_x\) 高的山峰 \(s_y\)。同样的,若 \(s_x<k<s_y\),则不会优于 \(k=s_y\),因为一旦在位置 \(p\) 超过 \(s_x\),\(\{s_i\}\) 就会在 \([p,y]\) 上单调递增(毕竟在 \((x,y)\) 上没有其他高于 \(s_x\) 的山峰),挡在下边不如挡在 \(s_y\)。

根据以上推论,\(k\in \{s_i\}\),且必定是其中的前缀最大值。于是可以枚举 \(k\) 来计算答案:设 \(k=s_u\),因为 \(s_u\) 为前缀最大值,所以 \(k\) 不会对 \([1,u]\) 产生影响,只需考虑 \(k\) 对后面的贡献。而 \(k\) 对最终答案的作用只与 \(s[u+1,n]\) 中的最小值 \(min\) 有关,即让答案增加了 \(k-min\)。简单预处理即可。

E(废话连篇版)

球的移动方向并不固定,可以来回动,直接DP似乎具有后效性,无法计算。

仔细考虑这个问题,如果某个状态可以达到,需要满足什么条件?首先,球的数量要相同;其次,需要满足奇偶性的限制:令 \(S\) 为有球的箱子的序号之和,每移动一次改变 \(S\) 的奇偶,因此 \(S\) 最终的奇偶性固定;最后,\(k\) 要足够大以完成移动。

对于后面两个条件,可以算出移动的最小步数 \(k'\),判断 \(k\) 与 \(k'\) 奇偶性相同且 \(k'\leq k\)。而 \(k'\) 的计算只需把初始状态和最终状态的每个球按顺序一一对应,将位置差相加。

所以不妨令 \(f_{i,j,s}\) 表示考虑了前 \(i\) 个球,第 \(i\) 个球最终在位置 \(j\ (\ge i)\) ,前 \(i\) 个球最少要用 \(s\) 步的方案数。直接枚举第 \(i + 1\) 个球的位置进行转移,复杂度 \(O(n^2k\times n)=O(n^3k)\)。但得知第 \(i\) 个球的具体位置没啥卵用,稍加修改,令 \(j\) 表示第 \(i\) 个球放在 \(\le j\) 的位置,只要讨论 \(j+1\) 有没有球就能 \(O(1)\) 转移,复杂度变为 \(O(n^2k)\)。

以上均为废话......退役一年半,说话变啰嗦了。接下来考虑关键的优化。

注意到 \(k\) 只有 \(n\) 的数量级,很多不可能的情况可以直接pass。具体的,若初始状态为 \(A\),末状态为 \(B\),\(A\) 的前 \(i\) 个箱子中有 \(c\) 个球,那么 \(B\) 的前 \(i\) 个箱子中球的个数在区间 \([c-\sqrt k,c+\sqrt k]\) 内。于是,复杂度优化为 \(O(nk\sqrt k)\)。

#include <bits/stdc++.h>
using namespace std;
void read (int &x) {
    char ch = getchar(); x = 0; while (!isdigit(ch)) ch = getchar();
    while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
} const int N = 1505, mod = 1e9 + 7;
int n, k, tot, w[N], a[N], c[N];
// int f[N][80][N];  内存过大,滚动优化
int f[2][80][N];
#define add(x, y) ((x += y) >= mod && (x -= mod))
signed main() {
    read (n), read (k);
    for (int i = 1; i <= n; ++i) read (a[i]);
    for (int i = 1; i <= n; ++i) {
        c[i] = c[i - 1]; if (a[i]) ++c[i], w[++tot] = i;
    }
    f[0][40][0] = 1;
    int m = (int)pow (k, 0.5);
    for (int i = 1; i <= n; ++i) {
        int I = (i & 1); memset (f[I], 0, sizeof (f[I]));
        for (int j = 40 - m; j <= 40 + m; ++j) {
            for (int s = 0; s <= k; ++s) {
                add (f[I][j][s], f[I ^ 1][j + a[i]][s]);
                if (c[i] + j - 40 > 0 && c[i] + j - 40 <= tot && s >= abs (i - w[c[i] + j - 40]))
                    add (f[I][j][s], f[I ^ 1][j + a[i] - 1][s - abs (i - w[c[i] + j - 40])]);
            }
        }
    }
    int ans = 0;
    for (int i = k; i >= 0; i -= 2) add (ans, f[n & 1][40][i]);
    printf ("%d\n", ans % mod);
    return 0;
}

标签:151,Educational,ch,int,Codeforces,40,奇偶性,mod,个球
From: https://www.cnblogs.com/whx666/p/17567107.html

相关文章

  • Codeforces Round 885 (Div. 2)
    Preface打的就是依托答辩居然也能上分,看来手稳还是重要的说D题半场开香槟以为随便写,然后没想到怎么处理这个局部没有三分性的函数,直接GG后面听学长一说其实分成四种函数分别求最值即可直接恍然大悟,只能说还是太菜太菜而且F好像是个蓝桥杯的某个题的弱化版,我说比赛的时候怎么那......
  • Codeforces Round 882 div.2 A
    Smiling&Weeping----总有人间一两风,填我十万八千梦A.TheManwhobecameaGodtimelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutput Kars istiredand......
  • Codeforces Round 885
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1848。我现在手里有三套题要补呃呃这套是两天前补的了,所以简单写写。太好玩辣,多校!A考虑一个2x2的矩阵,若小波奇和她的辣妹朋友位于对角线上就会被辣妹朋友堵在墙角,若相邻则永远抓不到。发现移......
  • Codeforces Round #885 (Div. 2) A-D
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn,m,k;cin>>n>>m>>k;intx,y;cin>>x>>y;boolok=1;for(inti=1;i<=k;i++)......
  • Codeforces Round 885 (Div. 2)
    A.VikaandHerFriends枚举所有的点,判断是否存在点与Vika的距离和其他k个人的距离的奇偶性不同。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmod=998244353;voidsolve(){intn,m,k,sx,sy;cin>>n>>m>>k>......
  • CodeForces 1848E Vika and Stone Skipping
    洛谷传送门CF传送门感觉比这场的F简单。发现我们要进行\(x\)不断乘一些数然后求答案的操作,猜测答案与\(x\)的因数有关。如果你对数字比较敏感,不难发现答案就是\(x\)的奇因子个数。官方题解的证明:设\(x=f+(f-1)+\cdots+(f-(c-1))\),由等差数列求和公......
  • Codeforces Round 885 (Div. 2) A-D
    A.VikaandHerFriends题意:有一个n*m大小的矩阵,vika在点(a,b),她的k个朋友在分别(xi,yi),所有人每分钟都可以上下左右走一格,每一分钟vika先走,她的朋友后走,不能不走,问vika能否躲过朋友。Solution结论题,只要有一个朋友和她的距离是奇数,那么她肯定会被追上。voidsolve(){ int......
  • Codeforces Round #885(Div. 2)C
    C.维卡和价格标签每个测试的时间限制为1秒每个测试的内存限制为256兆字节输入:标准输入输出:标准输出维卡来到她最喜欢的化妆品店"GoldenPear"。她注意到n个物品的价格自她上次光顾以来发生了变化。她决定分析价格的变化,并计算每个物品的旧价格和新价格之间的差异。维卡喜......
  • Codeforces Round #885 (Div.2) Editorial
    B-VikaandtheBridge题意:从桥的一边走到另一边,每次只能踩在相同颜色的木板上,并且有一次操作,可以修改期中一个模板的颜色。问那种走法,跨过模板的最大值最小。思路:首先可以统计出选择每种颜色的,跳过木板的的个数,如果不能修改颜色,那么答案一定是每个颜色所对应的最大值的最小......
  • Codeforces Round 883 (Div. 3)
    只写部分题目。A.RudolphandCuttheRope#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=2e5+5;intt,n,a[N],b[N];signedmain(){ cin>>t; while(t--){ cin>>n; intres=0; for(inti=......