首页 > 其他分享 >[AGC031B] Reversi

[AGC031B] Reversi

时间:2023-08-20 15:12:41浏览次数:25  
标签:pre const int Reversi 石头 AGC031B dp

题目大意

有一个长度为 \(n\) 的数列 \(a\),你需要对其进行 \(q\) 次操作,操作有两种类型,按如下格式给出:

  • 1 x y:将 \(a_x\) 变成 \(y\);
  • 2 l r:询问位置在 \(\left[ l,r \right]\) 之间的不下降子串有多少个。

思路

考虑 DP。

考虑第 \(i\) 个石头,如果第 \(i\) 个石头不修改,方案数仍为 \(dp_{i-1}\);如果第 \(i\) 个石头修改,那么贡献就是第 \(i\) 个石头与前面所有颜色相同石头进行操作的可能操作数。

记 \(\operatorname{pre}_i\) 为上一个与 \(i\) 颜色相同石头的位置。

所以转移方程为

\[dp_i=dp_{i-1}+dp_{\operatorname{pre}_i} \]

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 5005000;
const int Mod = 1e9 + 7;

int n;

int a[N];

int cnt,col[N];

int dp[N],last[N];

int main() {
    ios::sync_with_stdio(false);
    cin >> n;

    for(int i = 1;i <= n; i++) {
        cin >> a[i];
    }
    
    for(int i = 1;i <= n; i++) {
        if(a[i] != a[i - 1]) {
            cnt ++;
            col[cnt] = a[i];
        }
    }

    dp[0] = 1;
    for(int i = 1;i <= cnt; i++) {
        dp[i] = dp[i - 1];

        if(last[col[i]]) {
            int j = last[col[i]];
            dp[i] = (dp[i] + dp[j]) % Mod;
        }

        last[col[i]] = i;
    }

    cout << (dp[cnt] + Mod) % Mod << "\n";
    return 0;
}

标签:pre,const,int,Reversi,石头,AGC031B,dp
From: https://www.cnblogs.com/baijian0212/p/AGC031B.html

相关文章

  • Reversing-x64Elf-100
     对应的脚本代码为: ......
  • 【攻防世界逆向】《getit》《no-strings-attached》《csaw2013reversing2》
    题目getit解法先用exeinfo打开看看文件格式无壳elf文件,放进ida64打开看看,并f5查看伪代码耐心的学习了一下。我先学了下面的文件操作fseek修改原指向stream流指针,按照第p【i】个位置从左开始数fputc把前面内容从上面的指针开始编辑不带格式化fprintf把内容写入流文......
  • 时间可逆的马氏链(Time Reversible Markov Chain)
    逆向过程考虑一个具有转移概率\(P_{ij}\)和平稳概率\(\pi_i\)的已经达到平稳状态的遍历的(不可约+非周期+正常返)马尔科夫链。假设这个马氏链在平稳态的状态序列是\(\{X_m,X_{m+1},\cdots\}\),现在我们沿时间的反方向来看这条链,具体地,我们希望考察\(P(X_m=j|X_{m+1}=i,X_{......
  • AtCoder Regular Contest 109 E 1D Reversi Builder
    洛谷传送门AtCoder传送门考虑固定\(s\)和每个格子的颜色,最终有多少个石子被染黑。结论:任何时刻只有不多于两个极大同色连通块。证明:设\([x,y]\)为当前的黑连通块,\([y+1,z]\)为白连通块。如果下一次染\(x-1\),若\(x-1\)为白,则\([x-1,z]\)都被染为白;否则\(x-1\)被......
  • 题解 ARC111B【Reversible Cards】
    我们将值域中每个数视作一个节点,将每张卡片视作连接两个节点的边,则问题转化为:对于每条边都选择一个端点,使得被选择的节点总数最大。显然每个连通块可以分开处理。设连通块......
  • B - Reversible Cards(树与图的基础)
    题目https://atcoder.jp/contests/arc111/tasks/arc111_b题意输入n(≤2e5)和一个n行2列的矩阵,矩阵元素范围[1,4e5]从每行中恰好选一个数,最多能选出多少个不......
  • 「解题报告」[ARC143E] Reversi
    挺弱智的题但是我不会首先从一个叶子开始考虑,如果这个叶子是白的那么就应该先选它,否则就应该先选它父亲。然后这样我们可以递归着对子树进行计算,一些子树需要先选,一些子......
  • AtCoder Regular Contest 143 E Reversi
    AtCoder传送门洛谷传送门翻转一个点会把它相邻的点全部翻转,因此先从叶子开始自下而上考虑。不难发现,如果这个叶子是白色,那么它一定比它的父亲先翻转(否则它就翻不了了);而......
  • Reversing Linked List
    Givenaconstant K andasinglylinkedlist L,youaresupposedtoreversethelinksofevery K elementson L.Forexample,given L being1→2→3→4→5......
  • django 报错 'set' object is not reversible 解决
    我的博客这个问题在网上随便一搜就有解决办法,说是把urls.py里面的urlpatterns=这部分的{}改成[]就可以了,想想也对,毕竟里面是个list也不是个dict先说下我的project内容......