Submission #462463

#TimeUsernameProblemLanguageResultExecution timeMemory
462463YeboiPipes (BOI13_pipes)C++14
83.15 / 100
531 ms36680 KiB
#include <bits/stdc++.h> #define ll long long #define mod 998244353 #define fastio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL) #define rep(i,s) for(ll i=0; i<s ; i++) #define f(i,a,b) for(ll i(a); i<b ; i++) const ll INF = 1000000000000000000; const ll N = 100001; const ll MOD = 1000000007; const ll modi = 1000000007; const ll MAXN = 10000000000; const ll rootval = 319; using namespace std; ll upedge[N]; ll ngood[N]; vector<ll> adj[N]; ll arr[N]; ll par[N]; ll n; void dfs1(ll v, ll p){ ll sum = 0; for(auto u : adj[v]){ if(u == p){ continue; } else{ if(upedge[u] == -1){ dfs1(u,v); } sum += upedge[u]; } } upedge[v] = arr[v] - sum; } void dfs2(ll v, ll p){ ll sum = 0; for(auto u : adj[v]){ if(u == p || ngood[u] == -1){ continue; } else{ if(upedge[u] == -1){ dfs2(u,v); } sum += upedge[u]; } } upedge[v] = arr[v] - sum; } void parents(ll v, ll p){ for(auto u : adj[v]){ if(u == p){ continue; } else{ par[u] = v; parents(u,v); } } } void parents2(ll v, ll p){ for(auto u : adj[v]){ if(u == p || ngood[u] == -1){ continue; } else{ par[u] = v; parents2(u,v); } } } vector<bool> visited; vector<ll> parent; ll cycle_start, cycle_end; bool dfs(ll v, ll par) { // passing vertex and its parent vertex visited[v] = true; for (ll u : adj[v]) { if(u == par) continue; // skipping edge to parent vertex if (visited[u]) { cycle_end = v; cycle_start = u; return true; } parent[u] = v; if (dfs(u, parent[u])) return true; } return false; } vector<ll> find_cycle() { visited.assign(n, false); parent.assign(n, -1); cycle_start = -1; vector<ll> cycle; for (ll v = 0; v < n; v++) { if (!visited[v] && dfs(v, parent[v])) break; } if (cycle_start == -1) { return cycle; } else { vector<ll> cycle; cycle.push_back(cycle_start); for (ll v = cycle_end; v != cycle_start; v = parent[v]){ cycle.push_back(v); } reverse(cycle.begin(), cycle.end()); return cycle; } } int main(){ fastio(); ll m; cin >> n >> m; vector<pair<ll,ll>> edges; rep(i,n){ cin >> arr[i]; upedge[i] = -1; } rep(i,m){ ll u,v; cin >> u >> v; --u,--v; adj[u].push_back(v); adj[v].push_back(u); edges.push_back(make_pair(u,v)); } if(m == n-1){ ll root = 0; rep(i,n){ if(adj[i].size() != 1){ root = i; break; } } rep(i,n){ if(adj[i].size() == 1){ upedge[i] = arr[i]; } } dfs1(root,-1); parents(root,-1); par[root] = -1; map<pair<ll,ll>,ll> mp; rep(i,n){ if(par[i] == -1){ continue; } else{ mp[{i,par[i]}] = upedge[i]; mp[{par[i],i}] = upedge[i]; } } rep(i,edges.size()){ ll u = edges[i].first; ll v = edges[i].second; cout << 2*mp[{u,v}] << endl; } } else if(m == n){ // one cycle exists so just find that one cycle done? rep(i,n){ if(adj[i].size() == 1){ upedge[i] = arr[i]; } } vector<ll> cycle = find_cycle(); rep(i,cycle.size()){ ngood[cycle[i]] = -1; } if(cycle.size() % 2 == 0){ assert(0 == 1); cout << 0 << endl; } else{ rep(j,cycle.size()){ ll i = cycle[j]; dfs2(i,-1); parents2(i,-1); par[i] = -1; } map<pair<ll,ll>,ll> mp; map<pair<ll,ll>,ll> mp2; rep(i,n){ if(par[i] != -1){ mp[{par[i],i}] = upedge[i]; mp[{i,par[i]}] = upedge[i]; mp2[{par[i],i}] = 2*upedge[i]; mp2[{i,par[i]}] = 2*upedge[i]; } } rep(i,cycle.size()){ for(auto u : adj[cycle[i]]){ if(ngood[u] == -1){ continue; } else{ arr[cycle[i]] = arr[cycle[i]] - mp[{cycle[i],u}]; } } } ll val = arr[cycle[0]]; f(i,1,cycle.size()){ if(i%2 == 1){ val += arr[cycle[i]]; } else{ val = val - arr[cycle[i]]; } } mp2[{cycle[0],cycle[1]}] = val; f(i,1,cycle.size()-1){ mp2[{cycle[i],cycle[i+1]}] = 2*arr[cycle[i]] - mp2[{cycle[i-1],cycle[i]}]; mp2[{cycle[i+1],cycle[i]}] = mp2[{cycle[i],cycle[i+1]}]; } mp2[{cycle[cycle.size()-1],cycle[0]}] = 2*arr[cycle[cycle.size()-1]] - mp2[{cycle[cycle.size()-1],cycle[cycle.size()-2]}]; mp2[{cycle[0],cycle[cycle.size()-1]}] = mp2[{cycle[cycle.size()-1],cycle[0]}]; rep(i,edges.size()){ cout << mp2[{edges[i].first,edges[i].second}] << endl; } } } else if(m > n){ cout << 0 << endl; } }

Compilation message (stderr)

pipes.cpp: In function 'int main()':
pipes.cpp:5:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    5 | #define rep(i,s) for(ll i=0; i<s ; i++)
......
  158 |         rep(i,edges.size()){
      |             ~~~~~~~~~~~~~~     
pipes.cpp:158:9: note: in expansion of macro 'rep'
  158 |         rep(i,edges.size()){
      |         ^~~
pipes.cpp:5:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    5 | #define rep(i,s) for(ll i=0; i<s ; i++)
......
  172 |         rep(i,cycle.size()){
      |             ~~~~~~~~~~~~~~     
pipes.cpp:172:9: note: in expansion of macro 'rep'
  172 |         rep(i,cycle.size()){
      |         ^~~
pipes.cpp:5:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    5 | #define rep(i,s) for(ll i=0; i<s ; i++)
......
  180 |             rep(j,cycle.size()){
      |                 ~~~~~~~~~~~~~~ 
pipes.cpp:180:13: note: in expansion of macro 'rep'
  180 |             rep(j,cycle.size()){
      |             ^~~
pipes.cpp:5:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    5 | #define rep(i,s) for(ll i=0; i<s ; i++)
......
  196 |             rep(i,cycle.size()){
      |                 ~~~~~~~~~~~~~~ 
pipes.cpp:196:13: note: in expansion of macro 'rep'
  196 |             rep(i,cycle.size()){
      |             ^~~
pipes.cpp:6:32: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    6 | #define f(i,a,b) for(ll i(a); i<b ; i++)
......
  207 |             f(i,1,cycle.size()){
      |               ~~~~~~~~~~~~~~~~  
pipes.cpp:207:13: note: in expansion of macro 'f'
  207 |             f(i,1,cycle.size()){
      |             ^
pipes.cpp:6:32: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    6 | #define f(i,a,b) for(ll i(a); i<b ; i++)
......
  216 |             f(i,1,cycle.size()-1){
      |               ~~~~~~~~~~~~~~~~~~
pipes.cpp:216:13: note: in expansion of macro 'f'
  216 |             f(i,1,cycle.size()-1){
      |             ^
pipes.cpp:5:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    5 | #define rep(i,s) for(ll i=0; i<s ; i++)
......
  222 |             rep(i,edges.size()){
      |                 ~~~~~~~~~~~~~~ 
pipes.cpp:222:13: note: in expansion of macro 'rep'
  222 |             rep(i,edges.size()){
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...