#P16813. [NWRRC 2024资格赛]Count the Operations

[NWRRC 2024资格赛]Count the Operations

题目描述

课堂上,Ania 编写了一个程序,对从 00n1n-1 的所有整数执行某项工作:

for (int i = 0; i < n; i++) {
    work (i);
}

老师 Petia 看过程序后指出,由于 nn 的最大值可达 10910^9,程序运行时间会太长。

于是 Ania 决定只对一部分整数执行工作。她的新程序如下:

for (int i = 0; i < n; i++) {
    if (i == x_1) i = y_1;
    if (i == x_2) i = y_2;
    ...
    if (i == x_k) i = y_k;
    work (i);
}

给定 nn 和这段程序,求程序总共执行多少次操作,并判断它是否能够终止。

本题计数的操作包括:

  • 赋值操作:i = 0i++i = y_1 等;
  • 比较操作:i < ni == x_1 等;
  • 调用 work (i) 本身。

每次上述操作均计为一次操作。

输入格式

输入是一段由 Ania 编写的程序,其格式与样例完全一致。特别地:

  • for 所在行同时包含左花括号;
  • 每个左圆括号前均有一个空格;
  • 缩进恰好为四个空格;
  • 每行行末没有多余空格;
  • 所有 if 语句之后恰好出现一次 work 语句。

数据范围

设条件语句的数量为 kk,则

0k105.0\le k\le 10^5.

所有数值满足

0xi,yi<n109.0\le x_i,y_i<n\le 10^9.

除此之外,xi,yix_i,y_i 可以任意取值,且不同条件语句可以包含相同的数值。

输出格式

输出程序执行的操作总数。

如果程序永远无法终止,输出 -1

样例 1

for (int i = 0; i < 3; i++) {
    work (i);
}
11

对应的操作依次为:

i = 0; 0 < 3; work (0);
i++; 1 < 3; work (1);
i++; 2 < 3; work (2);
i++; 3 < 3.

样例 2

for (int i = 0; i < 5; i++) {
    if (i == 3) i = 1;
    if (i == 1) i = 3;
    if (i == 3) i = 4;
    work (i);
}
16

对应的操作依次为:

i = 0; 0 < 5; 0 == 3;
0 == 1; 0 == 3; work (0);
i++; 1 < 5; 1 == 3;
1 == 1; i = 3; 3 == 3;
i = 4; work (4); i++;
5 < 5.