Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include <set>
- const int N(500);
- using namespace std;
- typedef pair<int,int> II;
- typedef set<II>::iterator iter;
- set<II> group[3];
- int remain[N], revtype[N], temremain[N];
- vector<int> type[3];
- vector<int> pre[N];
- int main(){
- int n;
- scanf("%d", &n);
- for(int i = 0; i < n; ++i){
- int t;
- scanf("%d", &t);
- --t;
- type[t].push_back(i);
- revtype[i] = t;
- }
- for(int i = 0; i < n; ++i){
- scanf("%d", &temremain[i]);
- for(int j = 0; j < temremain[i]; ++j){
- int val;
- scanf("%d", &val);
- --val;
- pre[val].push_back(i);
- }
- }
- int vmin = 999999999;
- for(int start = 0; start < 3; ++start){
- group[0].clear();
- group[1].clear();
- group[2].clear();
- for(int i = 0; i < n; ++i){
- remain[i] = temremain[i];
- group[revtype[i]].insert(II(remain[i], i));
- }
- int complete = 0;
- int now = start;
- int cnt = 0;
- while(complete < n){
- iter i = group[now].begin();
- while(i != group[now].end()){
- if(i->first != 0) break;
- //printf("finish %d at %d\n", i->second, now);
- for(int j = 0; j < pre[i->second].size(); ++j){
- int al = pre[i->second][j];
- //printf("help %d to %d\n", al, remain[al] - 1);
- iter it = group[revtype[al]].find(II(remain[al], al));
- group[revtype[al]].erase(it);
- --remain[al];
- group[revtype[al]].insert(II(remain[al], al));
- //printf("at %d (%d,%d)\n", revtype[al], remain[al], al);
- }
- group[now].erase(i);
- i = group[now].begin();
- cnt++;
- complete++;
- }
- now++;
- now %= 3;
- cnt++;
- }
- vmin = min(vmin, cnt - 1);
- //printf("%d\n", cnt - 1);
- }
- printf("%d\n", vmin);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement