답안 #47293

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
47293 2018-04-30T09:43:36 Z Talant Fireworks (APIO16_fireworks) C++17
0 / 100
11 ms 9720 KB
#include <bits/stdc++.h>

#define mk make_pair
#define sc second
#define fr first
#define pb emplace_back
#define all(s) s.begin(), s.end()
#define sz(s) ( (int)s.size() )
#define int long long

using namespace std;

const int inf = (int)1e9 + 7;
const int N = (int)2e5 + 7;

int n,m;
int x,w;
int d[N];
int dd[N],u[N];
int cur;
int mx,ans = inf;


vector <pair<int,int> > g[N];
vector <int> t[N];

void dfs (int v,int p = 0) {
      d[v] += u[v];
      d[v] += d[p];

      if (v > n)
            t[v].pb(v);

      for (auto to : g[v]) {
            dfs(to.fr,v);
            for (auto x : t[to.fr])
                  t[v].pb(x);
      }
}
int check(int v,int add) {
      int sum = 0,sum1 = 0,cn = 0,cnt = 0,c = 0;
      for (auto to : t[v]) {
            if (dd[to] < 0)
                  sum += dd[to],cnt ++;
            else if (dd[to] > 0)
                  sum1 += dd[to],cn ++;
            else
                  c ++;
      }
      if (add >= 0) {
            cnt += c;
            sum1 -= abs(cn * add);
            sum -= abs(cnt * add);
      }
      else {
            cn += c;
            sum1 += abs(cn * add);
            sum += abs(cnt * add);
      }
//      if (v == 3 && add == 1 && cur == 14)
//      cout << abs(sum) + abs(sum1) << endl;
      return (abs(sum) + abs(sum1));
}
void f (int v) {
      if (v > 1) {
            int l = -300,r = 300;
            while (r - l >= 3) {
                  int m1 = l + (r - l) / 3;
                  int m2 = r - (r - l) / 3;
                  if (check(v,m1) < check(v,m2))
                        r = m2;
                  else
                        l = m1;
            }
            int o = inf,oo = inf;
            for (int i = l; i <= r; i ++) {
                  if (o > check(v,i)) {
                        o = check(v,i);
                        oo = i;
                  }
                  else if(o == check(v,i)) {
                        if (abs(oo) > abs(i))
                              oo = i;
                  }
            }
            if (oo >= 0) {
                  for (auto to : t[v])
                        dd[to] -= abs(oo);
            }
            else {
                  for (auto to : t[v])
                        dd[to] += abs(oo);
            }
            mx += abs(oo);
      }
      for (auto to : g[v]) {
            f(to.fr);
      }
}
main () {
      cin >> n >> m;

      for (int i = 2; i <= n + m; i ++) {
            cin >> x >> w;
            g[x].pb(mk(i,w));
            u[i] = w;
      }

      dfs(1);

      for (int i = 0; i <= 300; i ++) {
            for (int j = n + 1; j <= n + m; j ++) {
                  dd[j] = i - d[j];
            }

            cur = i;
            f(1);
            ans = min(ans,mx);
            mx = 0;
      }
      cout << ans << endl;
}

Compilation message

fireworks.cpp:100:7: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main () {
       ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 9720 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 9720 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 9720 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 9720 KB Output isn't correct
2 Halted 0 ms 0 KB -