結果
| 問題 |
No.762 PDCAパス
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-12-11 01:56:08 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 439 ms / 2,000 ms |
| コード長 | 3,659 bytes |
| コンパイル時間 | 2,534 ms |
| コンパイル使用メモリ | 79,868 KB |
| 実行使用メモリ | 61,632 KB |
| 最終ジャッジ日時 | 2024-09-16 16:00:44 |
| 合計ジャッジ時間 | 11,545 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 38 |
ソースコード
package net.ipipip0129.yukicoder.no762;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] split_str = reader.readLine().split(" ");
int leaf_num = Integer.parseInt(split_str[0]);
int pass_num = Integer.parseInt(split_str[1]);
PDCALeaf[] pdcaLeaves = new PDCALeaf[leaf_num];
String pdca_str = reader.readLine();
for (int i = 0; i < leaf_num; i++) {
switch (pdca_str.charAt(i)) {
case 'P':
pdcaLeaves[i] = new PDCALeaf(PDCA.Plan, 0);
break;
case 'D':
pdcaLeaves[i] = new PDCALeaf(PDCA.Do, 0);
break;
case 'C':
pdcaLeaves[i] = new PDCALeaf(PDCA.Check, 0);
break;
case 'A':
pdcaLeaves[i] = new PDCALeaf(PDCA.Act, 1);
break;
}
}
for (int i = 0; i < pass_num; i++) {
split_str = reader.readLine().split(" ");
int a_num = Integer.parseInt(split_str[0]) - 1;
int b_num = Integer.parseInt(split_str[1]) - 1;
PDCA a_type = pdcaLeaves[a_num].getType();
PDCA b_type = pdcaLeaves[b_num].getType();
if ((a_type == PDCA.Act && b_type == PDCA.Check) ||
(a_type == PDCA.Check && b_type == PDCA.Do) ||
(a_type == PDCA.Do && b_type == PDCA.Plan)) {
pdcaLeaves[b_num].addLeaf(a_num);
} else if ((a_type == PDCA.Check && b_type == PDCA.Act) ||
(a_type == PDCA.Do && b_type == PDCA.Check) ||
(a_type == PDCA.Plan && b_type == PDCA.Do)) {
pdcaLeaves[a_num].addLeaf(b_num);
}
}
PDCA[] check_array = new PDCA[] {PDCA.Check, PDCA.Do, PDCA.Plan};
for (int j = 0; j < 3; j++) {
for (int i = 0; i < leaf_num; i++) {
if (pdcaLeaves[i].getType() == check_array[j]) {
long leaf_weight = pdcaLeaves[i].getWeight();
for (int leaf : pdcaLeaves[i].getLeaf_list()) {
leaf_weight += pdcaLeaves[leaf].getWeight();
}
pdcaLeaves[i].setWeight(leaf_weight);
}
}
}
long ans = 0;
for (int i = 0; i < leaf_num; i++) {
if (pdcaLeaves[i].getType() == PDCA.Plan) {
ans += pdcaLeaves[i].getWeight();
}
}
System.out.println(ans % 1000000007);
reader.close();
}
}
class PDCALeaf {
PDCA type_pdca;
long weight;
List<Integer> leaf_list;
PDCALeaf(PDCA type, int weight) {
this.type_pdca = type;
this.weight = weight;
this.leaf_list = new ArrayList<>();
}
void addLeaf(int leaf_num) {
leaf_list.add(leaf_num);
}
PDCA getType() {
return type_pdca;
}
List<Integer> getLeaf_list() {
return leaf_list;
}
long getWeight() {
return weight;
}
public void setWeight(long weight) {
this.weight = weight;
}
}
enum PDCA {
Plan,
Do,
Check,
Act
}