QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#65691#3805. PromotionskannerWA 8ms6108kbC++143.1kb2022-12-03 00:15:552022-12-03 00:15:58

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-12-03 00:15:58]
  • Judged
  • Verdict: WA
  • Time: 8ms
  • Memory: 6108kb
  • [2022-12-03 00:15:55]
  • Submitted

answer

//https://onlinejudge.org/external/130/13015.pdf
//13015

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<set>

using namespace std;

int bfs(vector<pair<set<int>, vector<int>>>graph, vector<int>&roots, vector<int>visits, int ttl, set<int>&conj){ //pasamos una copia del grafo, y estructura de visitados, ya que los modificamos y no hacemos llamados recursivos 

    int i, ans = 0, node, auxNode, size = 0;
    queue<int>q;

    for(i = 0; i<roots.size(); i++){ //identificamos los nodos raiz
        
        if(roots[i] == 0){

            q.push(i);
            ans+=1;
            visits[i] = true;
            conj.insert(i);
        }
    }  

    if(ans > ttl){
        
        return  0;//no es posible desde el primer nivel
    }
    
    q.push(-1); //level

    while(!q.empty()){

        node = q.front();

        q.pop();

        if(node == -1){ //cada vez que encontramos un nuevo nivel, evaluamos si la cantidad de empleados ascendidos es menor o igual al limite
            
            if(ans+size > ttl){
                
                return ans; //si no es posible retornamos lo calculado en los anteriores niveles 
            }

            else if(!q.empty()){//evaluamos si aun se puede seguir, o hay otro nivel y aun hay empleados por ascender

                q.push(-1);
                ans+=size;
                size = 0;
            }
        }

        else{
        
            for(i = 0; i<graph[node].second.size(); i++){

                auxNode = graph[node].second[i];

                if(visits[auxNode] == false){

                    if(graph[auxNode].first.size() == 1){//evaluamos si tiene un solo predecesor

                        visits[auxNode] = true;
                        size++;
                        q.push(auxNode);
                        
                        if(ans + size <= ttl){//evaluamos si es imposible llegar a ese nodo

                            conj.insert(auxNode);

                        }
                    }

                    graph[auxNode].first.erase(node);//al llevar desde un predecesor, lo elimnamos, hasta que solo dependa de 1

                }
            }
        }
    }

    return ans;
}

int main(){

    int A, B, employees, precedence, employe1, employe2, ans, i;

    while(scanf("%i %i %i %i", &A, &B, &employees, &precedence) != EOF){
        
        set<int>conj;
        vector<pair<set<int>, vector<int>>>graph(employees);
        vector<int>roots(employees, 0);
        vector<int>visits(employees, false);

        while(precedence--){

            scanf("%i %i", &employe1, &employe2);

            graph[employe2].first.insert(employe1);//guardamos los predecesores
            graph[employe1].second.push_back(employe2);
            roots[employe2] = -1; //cambiamos el estado a -1, ya que al ser un nodo que se puede visitar, no es una raiz
        }

        cout<<bfs(graph, roots, visits, A, conj)<<endl;
        cout<<bfs(graph, roots, visits, B, conj)<<endl;
        cout<<employees-conj.size()<<endl;
    }

    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 3312kb

input:

3 4 7 8
0 4
1 2
1 5
5 2
6 4
0 1
2 3
4 5

output:

2
4
3

result:

ok 3 lines

Test #2:

score: -100
Wrong Answer
time: 8ms
memory: 6108kb

input:

3000 3500 5000 20000
1756 555
4733 3690
2912 2765
1233 1405
2822 1013
1664 4643
465 3265
3133 3063
2592 2060
2540 3030
209 2208
2708 3115
4839 463
9 3672
3446 2864
198 3985
1947 3892
1312 4255
130 485
3183 3653
1081 72
1730 3727
1017 1731
2494 4156
4826 2405
984 3653
4649 3164
929 4453
4163 4336
80 ...

output:

2898
3335
1500

result:

wrong answer 1st lines differ - expected: '1', found: '2898'