답안 #127152

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
127152 2019-07-09T01:23:36 Z wilwxk Designated Cities (JOI19_designated_cities) C++14
23 / 100
2000 ms 31768 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN=2e5+5;
vector<tuple<int, ll, ll> > g[MAXN];
pair<ll, int> mprof[MAXN][2];
bool marc[MAXN];
ll dp[MAXN];
ll respf[MAXN], somaf;
int n, q, raiz;

void melhora(int cur, pair<ll, int> val) {
	if(val.first>=mprof[cur][0].first) {
		mprof[cur][1]=mprof[cur][0];
		mprof[cur][0]=val;
	}
	else if(val.first>mprof[cur][1].first) {
		mprof[cur][1]=val;
	}
}

void recalc(int cur, int p) {
	dp[cur]=0;
	mprof[cur][0]=mprof[cur][1]={0, cur};
	for(auto aresta : g[cur]) {
		int viz; ll peso, rpeso;
		tie(viz, peso, rpeso)=aresta;
		if(viz==p) continue;
		recalc(viz, cur);

		dp[cur]+=dp[viz]+rpeso;
		if(!marc[viz]) melhora(cur, {mprof[viz][0].first+peso, mprof[viz][0].second});
		else melhora(cur, {mprof[viz][0].first, mprof[viz][0].second});
	}
}

void dfs(int cur, int p) {
	respf[1]=max(respf[1], dp[cur]);
	if(dp[cur]+mprof[cur][0].first>respf[2]) {
		respf[2]=dp[cur]+mprof[cur][0].first;
		raiz=cur;
	}
	// printf("dp[%d]= %lld // mprof[%d][0]= %lld, %d\n", cur, dp[cur], cur, mprof[cur][0].first, mprof[cur][0].second);
	for(auto aresta : g[cur]) {
		int viz; ll peso, rpeso;
		tie(viz, peso, rpeso)=aresta;
		if(viz==p) continue;

		ll dpc=dp[cur], dpv=dp[viz];
		auto mprofc0=mprof[cur][0], mprofc1=mprof[cur][1];
		auto mprofv0=mprof[viz][0], mprofv1=mprof[viz][1];

		dp[cur]-=(dp[viz]+rpeso);
		dp[viz]+=(dp[cur]+peso);
		if(mprof[cur][0].second==mprof[viz][0].second) mprof[cur][0]=mprof[cur][1];
		melhora(viz, {mprof[cur][0].first+rpeso, mprof[cur][0].second});

		dfs(viz, cur);

		dp[cur]=dpc; dp[viz]=dpv;
		mprof[cur][0]=mprofc0; mprof[cur][1]=mprofc1;
		mprof[viz][0]=mprofv0; mprof[viz][1]=mprofv1;
	}
}

void pinta(int cur, int p, int alvo) {
	if(cur==alvo) marc[cur]=1;
	for(auto aresta : g[cur]) {
		int viz; ll peso, rpeso;
		tie(viz, peso, rpeso)=aresta;
		if(viz==p) continue;
		pinta(viz, cur, alvo);
		if(marc[viz]) marc[cur]=1;
	}
}

int main() {
	scanf("%d", &n);
	for(int i=1; i<n; i++) {
		int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d);
		g[a].push_back({b, c, d}); g[b].push_back({a, d, c});
		somaf+=c; somaf+=d;
	}

	recalc(1, 1);
	dfs(1, 1);
	recalc(raiz, raiz);
	pinta(raiz, raiz, mprof[raiz][0].second);
	recalc(raiz, raiz);

	for(int i=3; i<=n; i++) {
		respf[i]=respf[i-1]+mprof[raiz][0].first;
		int cara=mprof[raiz][0].second;
		pinta(raiz, raiz, cara);
		recalc(raiz, raiz);
		// printf("respf[%d] usa %d\n", i, cara);
	}

	scanf("%d", &q);
	while(q--) {
		int val; scanf("%d", &val);
		printf("%lld\n", somaf-respf[val]);
	}
}

Compilation message

designated_cities.cpp: In function 'int main()':
designated_cities.cpp:79:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
designated_cities.cpp:81:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d);
                   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
designated_cities.cpp:100:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &q);
  ~~~~~^~~~~~~~~~
designated_cities.cpp:102:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int val; scanf("%d", &val);
            ~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 5112 KB Output is correct
2 Correct 6 ms 4988 KB Output is correct
3 Correct 6 ms 4984 KB Output is correct
4 Correct 8 ms 5112 KB Output is correct
5 Correct 7 ms 5112 KB Output is correct
6 Correct 8 ms 5112 KB Output is correct
7 Correct 6 ms 5112 KB Output is correct
8 Correct 6 ms 4984 KB Output is correct
9 Correct 6 ms 4984 KB Output is correct
10 Correct 6 ms 5112 KB Output is correct
11 Correct 6 ms 4856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 4984 KB Output is correct
2 Execution timed out 2060 ms 31768 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 4984 KB Output is correct
2 Execution timed out 2064 ms 29644 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 5112 KB Output is correct
2 Correct 6 ms 4988 KB Output is correct
3 Correct 6 ms 4984 KB Output is correct
4 Correct 8 ms 5112 KB Output is correct
5 Correct 7 ms 5112 KB Output is correct
6 Correct 8 ms 5112 KB Output is correct
7 Correct 6 ms 5112 KB Output is correct
8 Correct 6 ms 4984 KB Output is correct
9 Correct 6 ms 4984 KB Output is correct
10 Correct 6 ms 5112 KB Output is correct
11 Correct 6 ms 4856 KB Output is correct
12 Correct 6 ms 4988 KB Output is correct
13 Correct 239 ms 5496 KB Output is correct
14 Correct 346 ms 5628 KB Output is correct
15 Correct 243 ms 5376 KB Output is correct
16 Correct 241 ms 5368 KB Output is correct
17 Correct 242 ms 5372 KB Output is correct
18 Correct 231 ms 5492 KB Output is correct
19 Correct 244 ms 5360 KB Output is correct
20 Correct 209 ms 5368 KB Output is correct
21 Correct 248 ms 5496 KB Output is correct
22 Correct 246 ms 5392 KB Output is correct
23 Correct 212 ms 5496 KB Output is correct
24 Correct 114 ms 5388 KB Output is correct
25 Correct 328 ms 5644 KB Output is correct
26 Correct 106 ms 5368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 4984 KB Output is correct
2 Execution timed out 2060 ms 31768 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 5112 KB Output is correct
2 Correct 6 ms 4988 KB Output is correct
3 Correct 6 ms 4984 KB Output is correct
4 Correct 8 ms 5112 KB Output is correct
5 Correct 7 ms 5112 KB Output is correct
6 Correct 8 ms 5112 KB Output is correct
7 Correct 6 ms 5112 KB Output is correct
8 Correct 6 ms 4984 KB Output is correct
9 Correct 6 ms 4984 KB Output is correct
10 Correct 6 ms 5112 KB Output is correct
11 Correct 6 ms 4856 KB Output is correct
12 Correct 6 ms 4984 KB Output is correct
13 Execution timed out 2060 ms 31768 KB Time limit exceeded
14 Halted 0 ms 0 KB -