Stay Hungry,Stay Foolish!

D - Pair of Balls

D - Pair of Balls

https://atcoder.jp/contests/abc216/tasks/abc216_d

 

思路

m个桶, n个颜色,

第一轮遍历所有桶的最上面球的颜色,

将相同颜色的球所在队列, 计入 color节点,

即是说,存在两个桶的最上面的两个球颜色相同, 例如 a11 和 ax1 都是颜色3

那么3颜色计入任务处理队列

对任务队列处理后, 1 和 x桶做pop顶部节点, 然后将1 和 x桶的新的顶部颜色 计入 color, 如果颜色达到两个, 计入任务处理队列,

继续处理队列,直至队列为空。

 

最后检测所有桶是否为空, 如果有一个桶不为空, 则输出No

否则输出Yes

 

 

 

 

 

Code

https://atcoder.jp/contests/abc216/submissions/38719333

int n, m;

int main()
{

    cin >> n >> m;

    vector<queue<int> > cylinders(m+1);
    
    for(int i=1; i<=m; i++){
        int ki;
        
        cin >> ki;
        
        for(int j=1; j<=ki; j++){
            int aij;
            cin >> aij;
            
            queue<int>& cylinder_i = cylinders[i];
            cylinder_i.push(aij);
        }
        
//        cout << "cylinders i size=" << cylinders[i].size() << endl;
    }

    vector< vector<int> > colors(n+1);
    queue<int> tasks;

    for(int i=1; i<=m; i++){
        queue<int>& cylinder_i = cylinders[i];
        
        if (cylinder_i.empty()){
            continue;
        }
        
        int color = cylinder_i.front();
        
        colors[color].push_back(i);
        
        if(colors[color].size() == 2){
            tasks.push(color);
//            cout << "got color =" << color << endl;
        }
    }

    while(!tasks.empty()){
        int color_hit = tasks.front();
//        cout << "color_hit =" << color_hit << endl;
        
        tasks.pop();
        
        vector<int>& two_cylinders = colors[color_hit];
        int first_cylinder_num = two_cylinders[0];
        int second_cylinder_num = two_cylinders[1];

        queue<int>& first_cylinder = cylinders[first_cylinder_num];
        queue<int>& second_cylinder = cylinders[second_cylinder_num];
        
        first_cylinder.pop();
        second_cylinder.pop();
        
        if (!first_cylinder.empty()){
            int first_cylinder_front_color = first_cylinder.front();
            colors[first_cylinder_front_color].push_back(first_cylinder_num);
            
            if (colors[first_cylinder_front_color].size() == 2){
                tasks.push(first_cylinder_front_color);
            }
        }
        
        if (!second_cylinder.empty()){
            int second_cylinder_front_color = second_cylinder.front();
            colors[second_cylinder_front_color].push_back(second_cylinder_num);
            
            if (colors[second_cylinder_front_color].size() == 2){
                tasks.push(second_cylinder_front_color);
            }
        }
    }
    
    for(int i=1; i<=m; i++){
//        cout << "cylinders i size=" << cylinders[i].size() << endl;
        if (!cylinders[i].empty()){
            cout << "No" << endl;
            return 0;
        }
    }

    cout << "Yes" << endl;

    return 0;
}

 

posted @ 2023-02-08 22:26  lightsong  阅读(17)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel