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}\ ...
随机推荐
- 微信小程序组建通信
子组件传递父组件需要用到triggerEvent方法,当子组件(自定义组件)点击button的时候调用triggerEvent方法传递一些数据,首先第一个属性为自定义名称(myevent)对应父组件( ...
- Vue-cli代理解决跨域问题
使用vue-cli调接口的时候,总是会出现垮与问题,因为vue的localhost与访问域名不一致导致.而这一点,开发者显然也想到了,故而在vuejs-templates,也就是vue-cli的使用的 ...
- 快速搭建Hadoop-Hive-Zoopkeeper-Sqoop环境进入Sqoop学习环境
原文链接: https://www.toutiao.com/i6771763211927552523/ CDH简单了解 CDH: C:cloudera(公司) D:distribute H:Hadoo ...
- k8s中的nginx-ingress如何配置路径重定向
k8s中的nginx-ingress如何配置路径重定向 一. 需求描述 路径重定向的一般应用场景: 调整用户浏览的URL,看起来更规范 为了让搜索引擎收录网站内容,让用户体验更好 网站更换新域名后 根 ...
- 【reverse】逆向6 JCC
[reverse]逆向6 JCC 前言 我们之前学习的时候讲了,eip寄存器存储的是当前(即将执行的语句的) 指向地址 而我们之前提到的下断点(F2),就和我们编程中的下断点一样,执行到某句汇编指令然 ...
- 【get√】golang中实现从腾讯云CVM查询网卡流量的两种方法
公众号文章链接 主要参考了以下位置的资料: 云服务器监控接口 腾讯云go-sdk example 方法一:使用腾讯云go-sdk go.mod文件中增加这样一行: github.com/tencent ...
- Tomcat-给Tomcat添加第三方jar包
给动态web工程添加额外jar包 1,打开项目结构菜单操作界面,添加一个自己的类库 2,添加你当前类库需要的jar包 3,选择你添加的类库,给哪个模块使用 4,选择Artifacts选项,将类库添加到 ...
- linux下怎么挂载U盘
一般来说linux系统会自动挂载u盘,如果是图形界面,你一插上u盘会自动弹出来文件夹. 如果是命令行界面 使用命令 fdisk -l (root下执行) 显示如下 一般u盘都是fat32格式 ...
- maven 项目搭建,本地环境配置。
一,下载地址 http://maven.apache.org/download.cgi 英文不好的,可以在浏览器下载个翻译的插件,就好了,我用的是谷歌. 二, 解压文件,安装在自己制定的目录,注意安装 ...
- 谷歌CEO桑达尔·皮查伊:区块链可能撼动云计算
谷歌CEO桑达尔·皮查伊在周二的季度收益电话会议上承认了Web3和区块链的力量. 皮查伊表示,Web3描述了基于区块链的互联网新愿景,区块链是一种分散.安全.透明的技术,支持加密货币网络.不可替代代币 ...