loj#P3877. 「PA 2020」Programowanie współbieżne

「PA 2020」Programowanie współbieżne

题目描述

题目译自 PA 2020 Runda 5 Programowanie współbieżne

为了准备算法竞赛,Bytie 决定学习一些并发编程的知识。毕竟,即使是 PA,也曾经出过分布式题(参考 PA 2018 Runda 4)。

Bytie 从编写 nn 个非常简单的程序开始。所有程序共享一个全局整数型变量 xx,此外,每个程序都有一个私有的计数器 yy。每个程序都由一连串的指令组成,每个指令都属于以下四种类型之一:

  • W\texttt W:将全局变量的值 xx 载入私有计数器 yy
  • Z\texttt Z:将私有计数器 yy 的值写入全局变量 xx
  • + c\texttt{+ }c:将 yy 的值加一正常数 cc
  • - c\texttt{- }c:将 yy 的值减一正常数 cc

Bytie 并行运行所有的程序。所有计数器 yy 和变量 xx 的初始值都是 00。这些程序的指令交错执行,即所有程序的所有指令都是一个接一个地执行,对于每个时刻,每个程序满足它的指令的一个前缀以一定顺序被执行。

这种交错执行的方式结果是相当不幸的,变量 xx 的最终值是如此之小,以至于让 Bytie 非常惊讶。他甚至怀疑这是不可能的,是他的电脑骗了他。帮助 Bytie 验证他的疑惑,写一个验证器,对于给定的程序,计算所有程序并行执行后变量 xx 的最小可能值是多少。

输入格式

第一行一个整数 t (1t105)t\ (1\le t\le 10^5),表示一组测试数据中测试点个数。

对于每个测试点,第一行一个整数 n (1n105)n\ (1\le n\le 10^5),表示 Bytie 写的程序个数。

接下来 2n2n 行描述每个程序。对于每个程序的描述有两行,第一行一个整数 l (1l105)l\ (1\le l\le 10^5),表示程序中指令个数。第二行包含对这 ll 个指令的描述,指令是如下四种类型之一:

  • 一个字符 W\texttt W:表示载入指令;
  • 一个字符 Z\texttt Z:表示写入指令;
  • 一个字符 +\texttt{+} 和一个数字 cc:表示给私有计数器加 cc
  • 一个字符 -\texttt{-} 和一个数字 cc:表示给私有计数器减 cc

对于一组数据中的所有测试点,ll 的总和不超过 10610^6

输出格式

输出 tt 行,第 ii 行是对第 ii 个测试点的回答,表示在并行执行这些程序后 xx 可能的最小值。

2
2
12
W + 2 Z W + 2 Z W + 2 Z W + 2 Z
12
W + 3 Z W + 3 Z W + 3 Z W + 3 Z
3
3
W W - 5
5
+ 9 Z + 1 Z W
8
+ 10 Z - 2 Z - 5 W - 1 Z

5
7