Submission #130770

# Submission time Handle Problem Language Result Execution time Memory
130770 2019-07-16T04:52:54 Z 이온조(#3169) Harbingers (CEOI09_harbingers) C++14
50 / 100
160 ms 41880 KB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;

struct line {
	int A;
	long long B;
	long long get(int x) { return 1LL*A*x + B; }
};

struct node {
	int lc, rc;
	line l;
};

const int iNF = 1e9;
const long long INF = 5LL * 1e18;
node EMP = {-1, -1, {0, INF}};

node T[500009]; int to;
int root[100009];

void add(node pi, node &ni, int s, int e, line L) {
	// printf("add: (%d, %d)\n", L.A, L.B);
	ni = pi;
	if(L.get(s) >= ni.l.get(s) && L.get(e) >= ni.l.get(e)) return;
	if(L.get(s) <= ni.l.get(s) && L.get(e) <= ni.l.get(e)) {ni.l = L; return;}
	int m = s+e >> 1;
	if(L.get(s) > ni.l.get(s)) swap(L, ni.l);
	if(L.get(m) < ni.l.get(m)) {
		swap(L, ni.l);
		ni.rc = to; T[to++] = EMP;
		if(pi.rc == -1) add(EMP, T[ni.rc], m, e, L);
		else add(T[pi.rc], T[ni.rc], m, e, L);
	}
	else {
		ni.lc = to; T[to++] = EMP;
		if(pi.lc == -1) add(EMP, T[ni.lc], s, m, L);
		else add(T[pi.lc], T[ni.lc], s, m, L);
	}
}
long long get(node id, int s, int e, int x) {
	// printf("get: (%lld, %lld)\n", id.l.A, id.l.B);
	if(x < s || e < x) return INF;
	int m = s+e >> 1;
	long long ret = id.l.get(x);
	if(id.lc != -1) ret = min(ret, get(T[id.lc], s, m, x));
	if(id.rc != -1) ret = min(ret, get(T[id.rc], m, e, x));
	return ret;
}

long long D[100009];
int S[100009], V[100009];
vector<pii> adj[100009];

void dfs(int x, int p, int de) {
	if(x != 1) D[x] = get(T[root[p]], 1, iNF, V[x]) + 1LL*de*V[x] + S[x];
	root[x] = to; T[to++] = EMP;
	add(T[root[p]], T[root[x]], 1, iNF, {-de, D[x]});
	for(auto& it: adj[x]) if(it.first != p) dfs(it.first, x, de + it.second);
}

int main() {
	int N; scanf("%d",&N);
	for(int i=0; i<N-1; i++) {
		int u, v, w; scanf("%d%d%d",&u,&v,&w);
		adj[u].push_back({v, w});
		adj[v].push_back({u, w});
	}
	for(int i=2; i<=N; i++) scanf("%d%d",&S[i],&V[i]);
	T[to++] = EMP;
	dfs(1, 0, 0);
	for(int i=2; i<=N; i++) printf("%lld ", D[i]);
	return 0;
}

Compilation message

harbingers.cpp: In function 'void add(node, node&, int, int, line)':
harbingers.cpp:28:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int m = s+e >> 1;
          ~^~
harbingers.cpp: In function 'long long int get(node, int, int, int)':
harbingers.cpp:45:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int m = s+e >> 1;
          ~^~
harbingers.cpp: In function 'int main()':
harbingers.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  int N; scanf("%d",&N);
         ~~~~~^~~~~~~~~
harbingers.cpp:66:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int u, v, w; scanf("%d%d%d",&u,&v,&w);
                ~~~~~^~~~~~~~~~~~~~~~~~~
harbingers.cpp:70:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=2; i<=N; i++) scanf("%d%d",&S[i],&V[i]);
                          ~~~~~^~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 4 ms 2680 KB Output is correct
2 Correct 7 ms 3192 KB Output is correct
3 Runtime error 98 ms 36472 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 106 ms 36732 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Correct 136 ms 19900 KB Output is correct
6 Correct 160 ms 19064 KB Output is correct
7 Correct 113 ms 16888 KB Output is correct
8 Runtime error 145 ms 41336 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 144 ms 41880 KB Execution killed with signal 11 (could be triggered by violating memory limits)
10 Runtime error 132 ms 41740 KB Execution killed with signal 11 (could be triggered by violating memory limits)