Startup
Comentário escrito por João Pedro Castro
Podemos visualizar a hierarquia dessa empresa como um grafo, onde os vértices (funcionários) tem outros vértices se ligando à ele (os subordinados). Além da estrutura do grafo, para cada funcionário vamos guardar seu chefe, salário, e a quantidade de subordinados com os quais ele está insatisfeito. Também é necessário guardar a quantidade de funcionários insatisfeitos no total, chamaremos esse valor de
.
Após montar o grafo (feito com as arestas sendo:
), receber o chefe de cada um e o salário, para preencher a quantidade de insatisfações basta percorrer o grafo começando do vértice 1 e aumentando o valor de
em uma unidade toda vez que
em 1 caso
, já que o estado do
vai mudar de satisfeito para insatisfeito.
Para todo funcionário
atualizado a ideia é checar se o “estado” (satisfeito ou insatisfeito) de seu chefe e dele mesmo (em relação ao seus subordinados) foram alterados, já que eles são os únicos com os quais isso pode ter acontecido. E isso pode ser feito com uma série de estruturas condicionais, que se resumem à:
- (chefe insatisfeito antes com o funcionário) e (chefe satisfeito agora)
- (chefe satisfeito antes com o funcionário) e (chefe insatisfeito agora)
Agora, para achar o valor de
(a resposta) atualizado, é só seguir o seguinte algoritimo:
- Se
![i \neq 1 ~\&~ salario[i] \geq salario[chefe[i]] ~\&~ novoSalario > salario[chefe[i]]” /></span><script type='math/tex'>i \neq 1 ~\&~ salario[i] \geq salario[chefe[i]] ~\&~ novoSalario > salario[chefe[i]]</script>
<ul>
<li><span class='MathJax_Preview'><img data-recalc-dims=](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_d7de344477018121d4b63a1428c1884f.gif?ssl=1)
- Se
(novo chefe insatisfeito):
![salario[i] > salario[chefe[i]] ~\&~ salario[chefe[i]] \geq novoSalario” /></span><script type='math/tex'>salario[i] > salario[chefe[i]] ~\&~ salario[chefe[i]] \geq novoSalario</script>
<ul>
<li><span class='MathJax_Preview'><img data-recalc-dims=](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_80ec85dbf53c940e881c03bd7b41cdc2.gif?ssl=1)
(chefe satisfeito de novo):
de
:
- Se
![salario[i] \geq salario[u] ~\&~ salario[u] > novoSalario” /></span><script type='math/tex'>salario[i] \geq salario[u] ~\&~ salario[u] > novoSalario</script>:
<ul>
<li><span class='MathJax_Preview'><img data-recalc-dims=](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_5b97a6ce85bae54d5d10544b45d6792a.gif?ssl=1)
- Se
(novo chefe insatisfeito):
![salario[u] > salario[i] ~\&~ novoSalario \geq salario[u]” /></span><script type='math/tex'>salario[u] > salario[i] ~\&~ novoSalario \geq salario[u]</script>:
<ul>
<li><span class='MathJax_Preview'><img data-recalc-dims=](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_701a52570f0ddc3850d70b186b7a1853.gif?ssl=1)
(chefe satisfeito de novo):
![salario[i] = novoSalario](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_a0c9b38ee9310606014ff97dcddcf990.gif?ssl=1)

Assim você também garante que os valores de
e
sempre permanecem atualizados. Segue a solução em C++:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <bits/stdc++.h> | |
| using namespace std; | |
| vector<vector<int>> adj; | |
| vector<int> salario; | |
| vector<int> chefe; | |
| vector<int> insatisfacoes; | |
| int f; | |
| void dfs(int i) { | |
| for (auto u : adj[i]) { | |
| if (u == chefe[i]) continue; | |
| if (salario[u] > salario[i]) { | |
| if (insatisfacoes[i] == 0) f++; | |
| insatisfacoes[i]++; | |
| } | |
| dfs(u); | |
| } | |
| } | |
| int main() { | |
| ios::sync_with_stdio(false); | |
| cin.tie(nullptr); | |
| int n, a; | |
| cin >> n; | |
| adj.resize(n+1); | |
| salario.resize(n+1); | |
| chefe.resize(n+1); | |
| insatisfacoes.resize(n+1); | |
| for (int i = 1; i <= n; i++) { | |
| cin >> chefe[i] >> salario[i]; | |
| adj[chefe[i]].push_back(i); | |
| } | |
| dfs(1); | |
| cout << f << "\n"; | |
| cin >> a; | |
| while (a–) { | |
| int i, novoSalario; | |
| cin >> i >> novoSalario; | |
| if (i != 1) { | |
| if ((salario[chefe[i]] >= salario[i]) and (novoSalario > salario[chefe[i]])) { | |
| insatisfacoes[chefe[i]]++; | |
| if (insatisfacoes[chefe[i]] == 1) f++; | |
| } | |
| else if ((salario[i] > salario[chefe[i]]) and (salario[chefe[i]] >= novoSalario)) { | |
| insatisfacoes[chefe[i]]–; | |
| if (insatisfacoes[chefe[i]] == 0) f–; | |
| } | |
| } | |
| for (auto u : adj[i]) { | |
| if ((salario[i] >= salario[u]) and (salario[u] > novoSalario)) { | |
| insatisfacoes[i]++; | |
| if (insatisfacoes[i] == 1) f++; | |
| } | |
| else if ((salario[u] > salario[i]) and (novoSalario >= salario[u])) { | |
| insatisfacoes[i]–; | |
| if (insatisfacoes[i] == 0) f–; | |
| } | |
| } | |
| cout << f << "\n"; | |
| salario[i] = novoSalario; | |
| } | |
| } |


