Solution -「CF 1380F」Strange Addition
\(\mathcal{Description}\)
Link.
定义两个数在进行加法时,进位单独作为一位。例如:
.
给定一个 \(n\) 为数和 \(m\) 次修改操作,每次修改会修改 \(n\) 位数的某一位数字。在每次修改后求出有多少对数以上述规则相加后的得数为这个 \(n\) 为数。
\(n,m\le5 \times 10^5\)。
\(\mathcal{Solution}\)
显然的 DDP。
令 \(f_i\) 表示加和为目标数后 \(i\) 为数字的数对数量。那么:
\begin{pmatrix}
f_i\\
f_{i-1}
\end{pmatrix}
=
\begin{pmatrix}
f_{i+1}\\
f_i
\end{pmatrix}
\]
其中 \(w_i~(i=1,2,\dots,18)\) 分别表示每种“一位数”的转移矩阵,只有 \(i=1\) 需要特殊处理。
具体看代码吧(摊手。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
inline int rint () {
int x = 0, f = 1; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x * f;
}
template<typename Tp>
inline void wint ( Tp x ) {
if ( x < 0 ) putchar ( '-' ), x = ~ x + 1;
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
}
const int MAXN = 5e5, MOD = 998244353;
const int w[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int n, m;
char num[MAXN + 5];
inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int mul ( long long a, const int b ) { return ( a *= b ) < MOD ? a : a % MOD; }
struct Matrix {
int mat[2][2];
Matrix (): mat {} {}
Matrix ( const int a, const int b, const int c, const int d ):
mat { a, b, c, d } {}
inline int* operator [] ( const int key ) { return mat[key]; }
inline Matrix operator * ( Matrix& t ) const {
Matrix ret;
for ( int i = 0; i < 2; ++ i ) {
for ( int k = 0; k < 2; ++ k ) {
for ( int j = 0; j < 2; ++ j ) {
ret[i][j] = add ( ret[i][j], mul ( mat[i][k], t[k][j] ) );
}
}
}
return ret;
}
inline void _show () const {
#ifdef RYBY
for ( int i = 0; i < 2; ++ i ) {
for ( int j = 0; j < 2; ++ j ) {
printf ( "%d ", mat[i][j] );
}
putchar ( '\n' );
}
#endif
}
};
inline Matrix digit ( const int d ) {
return Matrix ( w[num[d] - '0'], num[d] ^ '1' || d == n ? 0 : w[10 + num[d + 1] - '0'], 1, 0 );
}
struct SegmentTree {
Matrix mat[MAXN * 2 + 5];
inline int id ( const int l, const int r ) { return ( l + r ) | ( l != r ); }
inline int build ( const int l, const int r ) {
int rt = id ( l, r ), mid = l + r >> 1;
if ( l == r ) return ( mat[rt] = digit ( l ) )._show (), rt;
int lc = build ( l, mid ), rc = build ( mid + 1, r );
return mat[rt] = mat[lc] * mat[rc], rt;
}
inline void update ( const int l, const int r, const int x, const char d ) {
int rt = id ( l, r ), mid = l + r >> 1;
if ( l == r ) return num[l] = d, mat[rt] = digit ( l ), void ();
if ( x <= mid ) update ( l, mid, x, d );
else update ( mid + 1, r, x, d );
mat[rt] = mat[id ( l, mid )] * mat[id ( mid + 1, r )];
}
} segt;
int main () {
n = rint (), m = rint ();
scanf ( "%s", num + 1 );
int rt = segt.build ( 1, n );
for ( int x, d; m --; ) {
x = rint (), d = rint ();
segt.update ( 1, n, x, d ^ '0' );
if ( x > 1 ) segt.update ( 1, n, x - 1, num[x - 1] );
segt.mat[rt]._show ();
wint ( segt.mat[rt][0][0] ), putchar ( '\n' );
}
return 0;
}
Solution -「CF 1380F」Strange Addition的更多相关文章
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 1237E」Balanced Binary Search Trees
\(\mathcal{Description}\) Link. 定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...
- Solution -「CF 599E」Sandy and Nuts
\(\mathcal{Description}\) Link. 指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...
随机推荐
- Servlet初级学习加入数据库操作(三)
源代码地址(访问密码:7567):https://url56.ctfile.com/f/34653256-527822631-2e255a CRUD 增删改查 准备添加的操作 点击添加之后,出现新的页 ...
- Word2010制作收款单
原文链接:https://www.toutiao.com/i6488255406136099342/ 页面设置 选择"页面布局"选项卡,"页面设置"功能组,&q ...
- Java安全之Spring内存马
Java安全之Spring内存马 基础知识 Bean bean 是 Spring 框架的一个核心概念,它是构成应用程序的主干,并且是由 Spring IoC 容器负责实例化.配置.组装和管理的对象. ...
- 利用代码生成工具Database2Sharp生成ABP VNext框架项目代码
我们在做某件事情的时候,一般需要详细了解它的特点,以及内在的逻辑关系,一旦我们详细了解了整个事物后,就可以通过一些辅助手段来提高我们的做事情的效率了.本篇随笔介绍ABP VNext框架各分层项目的规则 ...
- FFT 傅里叶万岁
FFT --- Fast Foulier Transformation 以 $O(n \log n)$ 的速度计算 $\forall k=1,2,\dots,n, c[k]=\sum\limits_{ ...
- [转载]Win10蓝牙设备删除后无法连接解决办法
转自 https://blog.csdn.net/Tokeyman/article/details/86268005 现象 一般情况下,当操作系统无法与蓝牙设备,比如鼠标键盘等出现无法连接的情况,通过 ...
- 【解决了一个小问题】go.mod文件中引用另一个库,总会自动拉取新版本
我的项目依赖某个旧的公共库: require ( git.xxx.com/myprj/mylib v0.0.43 ) 可以编译的时候,系统总会自动加上这样的路径: require ( git.xxx. ...
- golang中文件和路径用法
package main import ( "fmt" "io/fs" "io/ioutil" "os" "p ...
- springmvc复习导图
spingmvcweb请求
- 第03讲:Flink 的编程模型与其他框架比较
Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 本课时我们主要介绍 ...