Educational Codeforces Round 153 D-E dp,bfs

这篇具有很好参考价值的文章主要介绍了Educational Codeforces Round 153 D-E dp,bfs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1860D Balanced String
首先只能是0和1交换,1在 i i i位置,0在 j j j位置,每交换一次产生的贡献是 2 ∗ ( i − j ) 2*(i-j) 2(ij),所以我们可以先算出原01串中所需要的贡献 m m m,我们发现找到 t o l tol tol 个1和0的位置 i k , j k i_k,j_k ik,jk ∑ k t o l i k − j k = m \sum_{k}^{tol} i_k-j_k=m ktolikjk=m,我们可以拆开 ∑ k t o l i k − ∑ k t o l j k = m \sum_{k}^{tol} i_k- \sum_{k}^{tol} j_k=m ktolikktoljk=m,然后分别dp出选tol个数,0,1的位置和分别有那些状态可以达到,易证位置和小于 n 2 n^2 n2,然后枚举 t o l tol tol,枚举1的位置和,算出0的位置和,判断两个状态是否能达到
时间复杂度 O ( n 4 ) O(n^4) O(n4)

void solve(){
    std::string s;
    std::cin>>s;
    int n=s.length();

    std::vector<int> a(n+1);
    int sum=0,m=0;
    for (int i=1;i<=n;i++){
        a[i]=s[i-1]-'0';
        if (a[i]){
            m-=i-1-sum;
        }else{
            m+=sum;
        }
        sum+=a[i];
    }

    m>>=1;
    std::vector<std::vector<int>> dp0(n+1,std::vector<int>(n*n+1)),dp1(n+1,std::vector<int>(n*n+1));
    dp0[0][0]=dp1[0][0]=1;
    for (int i=1;i<=n;i++){
        for (int j=i;j>=1;j--){
            for (int k=n*n;k>=i;k--){
                if (a[i]){
                    dp1[j][k]|=dp1[j-1][k-i];
                }else{
                    dp0[j][k]|=dp0[j-1][k-i];
                }
            }
        }
    }
    m=-m;
    for (int i=0;i<=n;i++){
        for (int j=0;j<=n*n;j++){
            int k=j-m;
            if (k>=0&&k<=n*n&&dp1[i][j]&&dp0[i][k]){
                std::cout<<i;
                return;
            }
        }
    }
}

1860E Fast Travel Text Editor
首先注意到是小写字母,说明最多 26 * 26 种组合方式,然后发现题意每次操作代价都为1,考虑建图,发现连边和对点的定义不好搞,考虑bfs,定义 d i s i , j , x dis_{i,j,x} disi,j,x,表示当前点 x x x,到某个形如 ′ a ′ + i , ′ a ′ + j 'a'+i,'a'+j a+i,a+j位置的最小距离,这样我们每次询问只要枚举 26 * 26 次,类似Floyed找中转点的方法, m i n ( y − x , d i s i , j , x + d i s i , j , y + 1 ) min(y-x,dis_{i,j,x}+dis_{i,j,y}+1) min(yx,disi,j,x+disi,j,y+1)

我们枚举每个 i , j i,j i,j,然后从形如 ′ a ′ + i , ′ a ′ + j 'a'+i,'a'+j a+i,a+j的位置出发,bfs向外扩展,更新各点的 d i s i , j , x dis_{i,j,x} disi,j,x,每次扩展除了到 x + 1 x+1 x+1 x − 1 x-1 x1点外,还要让 x x x通过第三种操作跳跃到其它点,由于每个点最多入队一次,所以时间复杂度为 O ( 2 6 2 ∣ s ∣ ) O(26^2\vert s \vert) O(262s)
总时间复杂度 O ( 2 6 2 ( m + ∣ s ∣ ) ) O(26^2 (m+\vert s \vert)) O(262(m+s))文章来源地址https://www.toymoban.com/news/detail-658559.html

const int inf=1e9;
void solve(){
    std::string s;
    std::cin>>s;
    int n=s.length();
    std::vector<int> pos[26][26];
    for (int i=1;i<n;i++){
        pos[s[i-1]-'a'][s[i]-'a'].push_back(i);
    }

    std::vector dis(26,std::vector(26,std::vector(n+2,inf)));
    for (int i=0;i<26;i++){
        for (int j=0;j<26;j++){
            std::queue<int> q;
            for (auto x:pos[i][j]){
                q.push(x);
                dis[i][j][x]=0;
            }
            std::vector<std::vector<int>> vis(26,std::vector<int>(26));
            vis[i][j]=1;

            while (!q.empty()){
                int x=q.front();
                q.pop();

                if (x-1>=1&&dis[i][j][x-1]==inf){
                    dis[i][j][x-1]=dis[i][j][x]+1;
                    q.push(x-1);
                }
                if (x+1<n&&dis[i][j][x+1]==inf){
                    dis[i][j][x+1]=dis[i][j][x]+1;
                    q.push(x+1);
                }
                int l=s[x-1]-'a',r=s[x]-'a';
                if (!vis[l][r]){
                    vis[l][r]=1;
                    for (auto v:pos[l][r]){
                        if (dis[i][j][v]==inf){
                            dis[i][j][v]=dis[i][j][x]+1;
                            q.push(v);
                        }
                    }
                }
            }
        }
    }

    int m;
    std::cin>>m;
    while (m--){
        int x,y;
        std::cin>>x>>y;
        int ans=abs(x-y);
        for (int i=0;i<26;i++){
            for (int j=0;j<26;j++){
                ans=std::min(ans,dis[i][j][x]+dis[i][j][y]+1);
            }
        }
        std::cout<<ans<<"\n";
    }
    
}

到了这里,关于Educational Codeforces Round 153 D-E dp,bfs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Educational Codeforces Round 151 (Rated for Div. 2)

    A. Forbidden Integer 题意 : 你有[1, k]内除了 x x x 的整数,每个数可以拿多次,问 ∑ = n sum = n ∑ = n 是否可行并构造 思路 : 有1必能构造,否则假如没有1,假如有2, 3必定能构造出大于等于2的所有数,否则只有2的话只能构造出偶数。 B. Come Together 题意 : 棋盘上两个点同时从

    2024年02月12日
    浏览(34)
  • Educational Codeforces Round 161 (Rated for Div. 2)

    Educational Codeforces Round 161 (Rated for Div. 2) 题意:开始没看懂。。。给出长度均为n的三个字符串abc,字符串s与模板t匹配的条件为:当模板位置字符为小写时, s i s_i s i ​ 与 t i t_i t i ​ 必须相同,大写时二者必须不同。这里注意,字符匹配过程是不区分大小写的,’C‘与’

    2024年01月19日
    浏览(29)
  • Educational Codeforces Round 148 (Rated for Div. 2) 题解

    总结:5.21下午VP一场,死在了A题,给我wa崩溃了,浪费了差不多一个小时,BC还挺顺畅,虽然C题是在结束后不久交上去的。。。。 思路:其实思路很简单, “ The string s a palindrome ”, 题目已经说了所给的为回文字符串,所以直接判断一半 有几种字符 即可(开始的时候计算整

    2024年02月06日
    浏览(30)
  • Educational Codeforces Round 154 (Rated for Div. 2)(A—D)

    从1到9,每个数后面都可以加一个数构成一个含有两个数的质数,只需要从s[1]~s[9]中找到一个数与s[0]构成质数即可 观察样例即可发现两个字符串只要在相同位置都有 01 存在就能成功实现转换后两个字符串相等 可以先假设字符串是可以成立的,那么接下来就判断它什么时间是

    2024年02月10日
    浏览(28)
  • Educational Codeforces Round 62 (Rated for Div. 2) C. Playlist

     一开始肯定要排个序,b相同时t大的在前边,不同时b大的在前面。 然后想最多只能选k个的限制,可以这样想,每次用到的b只能用已选到的最小的值,那可以把每个b都枚举一遍,然后每一次选时长最长的,且b大于等于当前的b的那k个不就好了吗,时间复杂度也才O(n),然

    2024年02月12日
    浏览(32)
  • Educational Codeforces Round 154 (Rated for Div. 2)(A—C)

    从1到9,每个数后面都可以加一个数构成一个含有两个数的质数,只需要从s[1]~s[9]中找到一个数与s[0]构成质数即可 观察样例即可发现两个字符串只要在相同位置都有 01 存在就能成功实现转换后两个字符串相等 可以先假设字符串是可以成立的,那么接下来就判断它什么时间是

    2024年02月10日
    浏览(29)
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

    C. Digital Logarithm 给两个长度位 n n n 的数组 a a a 、 b b b ,一个操作 f f f 定义操作 f f f 为, a [ i ] = f ( a [ i ] ) = a [ i ] a[i]=f(a[i])=a[i] a [ i ] = f ( a [ i ]) = a [ i ] 的位数 求最少多少次操作可以使 a 、 b a、b a 、 b 两个数组变得完全相同 性质: 对于任何数,经过两次操作我们一定可以

    2024年02月20日
    浏览(31)
  • 【每日一题】—— B. Ternary String (Educational Codeforces Round 87 (Rated for Div. 2))

    🌏博客主页: PH_modest的博客主页 🚩当前专栏: 每日一题 💌其他专栏: 🔴 每日反刍 🟡 C++跬步积累 🟢 C语言跬步积累 🌈座右铭: 广积粮,缓称王! 题目大意:给你一串由1、2、3组成的数组,让你求一个最短的子串,要求这个子串包含1、2、3 题目链接:B. Ternary String

    2024年02月16日
    浏览(30)
  • Educational Codeforces Round 157 (Rated for Div. 2) F. Fancy Arrays(容斥+组合数学)

    题目 称一个长为n的数列a是fancy的,当且仅当: 1. 数组内至少有一个元素在[x,x+k-1]之间 2. 相邻项的差的绝对值不超过k,即 t(t=50)组样例,每次给定n(1=n=1e9),x(1=x=40), 求fancy的数组的数量,答案对1e9+7取模 思路来源 灵茶山艾府群 官方题解 题解 看到 至少 的字眼,首先想到容斥,

    2024年02月05日
    浏览(31)
  • Educational Codeforces Round 161 (Rated for Div. 2) E. Increasing Subsequences 动态规划逼近,二进制拆分补充,注意严格递增

    Problem - E - Codeforces 目录 推荐视频: 题意: 细节(我踩得没什么价值的坑): 思路: 对样例3 (X = 13)做解释: —————— 总思路: —————— 动态规划逼近: —————— 二进制拆分补充剩余: 核心代码:  E_哔哩哔哩_bilibili 其实有一些细节说的不是特别清楚好

    2024年02月22日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包