답안 #556253

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
556253 2022-05-02T16:15:52 Z blue Designated Cities (JOI19_designated_cities) C++17
100 / 100
818 ms 67372 KB
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;

const int mx = 200'000;

using vi = vector<int>;
using vvi = vector<vi>;
using ll = long long;
using vll = vector<ll>;
#define sz(x) int(x.size())

const ll INF = 1'000'000'000'000'000'000LL;

int N;
vi A(1+mx), B(1+mx);
vll C(1+mx), D(1+mx);

vi edge[1+mx];

int L = 0;








ll basicCost = 0;
vll delta = vll(1+mx, 0);
vi vis = vi(1+mx, 0);


void dfs(int u, int p)
{
	vis[u] = 1;
	for(int e : edge[u])
	{
		int v = A[e] + B[e] - u;

		if(vis[v]) continue;

		if(v == B[e])
		{
			basicCost += C[e];
			delta[v] = delta[u] + D[e] - C[e];
		}
		else
		{
			basicCost += D[e];
			delta[v] = delta[u] + C[e] - D[e];
		}

		dfs(v, u);
	}
}









vi deg(1+mx, 0);






vi owner(1+mx-1, 0);


struct leaf
{
	int u; //leaf node-index
	int rep; //head of chain
	ll wt = 0;
};

bool operator < (leaf A, leaf B)
{
	return vll{A.wt, A.u} < vll{B.wt, B.u};
}


int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> N;

	for(int e = 1; e <= N-1; e++)
	{
		cin >> A[e] >> B[e] >> C[e] >> D[e];
		edge[A[e]].push_back(e);
		edge[B[e]].push_back(e);
	}

	for(int i = 1; i <= N; i++)
		L += (sz(edge[i]) == 1);

	vll ans(1+N, INF);





	//Part 1: E = 1
	dfs(1, 0);
	for(int i = 1; i <= N; i++)
		ans[1] = min(ans[1], basicCost + delta[i]);


















	//Part 2: E > 1






	for(int l = L; l <= N; l++)
		ans[l] = 0;



	for(int i = 1; i <= N; i++)
		deg[i] = sz(edge[i]);












	if(L >= 3)
	{
		queue<int> tbv;

		set<leaf> leaves;

		vi edgevis(1+N, 0);

		for(int i = 1; i <= N; i++)
		{
			if(deg[i] == 1)
			{
				tbv.push(i);
			}
		}

		set<leaf> antirep[1+N];




	// cerr << "done\n";

		vi actualdeg = deg;

		while(!tbv.empty())
		{
			int u = tbv.front();
			tbv.pop();

			// cerr << "u = " << u << '\n';

			ll wtu = 0LL;

			int ru = u;
			while(1)
			{
				bool nxt = 0;
				for(int e : edge[ru])
				{
					if(edgevis[e]) continue;

					edgevis[e] = 1;

					ru = A[e] + B[e] - ru;

					if(A[e] == ru)
						wtu += C[e];
					else
						wtu += D[e];

					if(deg[ru] != 2)
						break;

					nxt = 1;
				}

				if(nxt == 0) break;
			}

			leaves.insert({u, ru, wtu});
			// cerr << "inserting leaf :  " << u << ' ' << ru << ' ' << wtu << '\n';
			antirep[ru].insert({u, ru, wtu});
		}

		// cerr << sz(leaves) << '\n';




		for(int li = L-1; li >= 2; li--)
		{
			leaf z = *leaves.begin();

			leaves.erase(leaves.begin());

			ans[li] = ans[li+1] + z.wt;

			if(li == 2) break;

			int u = z.u;
			ll wtu = z.wt;
			int ru = z.rep;

			// cerr << "\n\n\n";
			// cerr << "erase leaf : " << u << ' ' << ru << '\n';

			antirep[ru].erase(z);

			actualdeg[ru]--;

			// cerr << ru << " : " << actualdeg[ru] << '\n';
			if(actualdeg[ru] == 2 && !antirep[ru].empty())
			{
				// cerr << "antirep size = " << sz(antirep[ru]) << '\n';
				// if(!antirep[ru].empty())
				auto lz = *antirep[ru].begin();
				// if(lz.rep != ru) break;
				// int u = *antirep[ru].begin();
				ll wtu = 0;

				// cerr << "modifying leaf : " << lz.u << '\n';

				antirep[ru].erase(lz);
				leaves.erase(lz);

				u = lz.u;
				wtu = lz.wt;
				ru = lz.rep;

				while(1)
				{
					bool nxt = 0;
					for(int e : edge[ru])
					{
						if(edgevis[e]) continue;

						edgevis[e] = 1;

						ru = A[e] + B[e] - ru;

						if(A[e] == ru)
							wtu += C[e];
						else
							wtu += D[e];

						if(actualdeg[ru] != 2)
							break;

						nxt = 1;
					}

					if(nxt == 0) break;
				}

				antirep[ru].insert({u, ru, wtu});
				leaves.insert({u, ru, wtu});

				// cerr << "new insert = " << u << ' ' << ru << ' ' << wtu << '\n';
			}
		}
	}


	






























	// for(int li = N; li >= 1; li--)
	// 	cerr << li << " : " << ans[li] << '\n';

	int Q;
	cin >> Q;

	for(int q = 1; q <= Q; q++)
	{
		int E;
		cin >> E;

		cout << ans[E] << '\n';
	}
}

Compilation message

designated_cities.cpp: In function 'int main()':
designated_cities.cpp:245:7: warning: unused variable 'wtu' [-Wunused-variable]
  245 |    ll wtu = z.wt;
      |       ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 13524 KB Output is correct
2 Correct 10 ms 14332 KB Output is correct
3 Correct 6 ms 13652 KB Output is correct
4 Correct 6 ms 14420 KB Output is correct
5 Correct 7 ms 14432 KB Output is correct
6 Correct 7 ms 14388 KB Output is correct
7 Correct 7 ms 14420 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
10 Correct 6 ms 13652 KB Output is correct
11 Correct 7 ms 14420 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 13524 KB Output is correct
2 Correct 498 ms 42788 KB Output is correct
3 Correct 202 ms 31692 KB Output is correct
4 Correct 495 ms 42712 KB Output is correct
5 Correct 556 ms 44300 KB Output is correct
6 Correct 491 ms 42704 KB Output is correct
7 Correct 642 ms 48836 KB Output is correct
8 Correct 276 ms 34792 KB Output is correct
9 Correct 755 ms 58308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 13652 KB Output is correct
2 Correct 513 ms 42780 KB Output is correct
3 Correct 225 ms 39764 KB Output is correct
4 Correct 488 ms 47720 KB Output is correct
5 Correct 568 ms 50416 KB Output is correct
6 Correct 477 ms 49100 KB Output is correct
7 Correct 731 ms 62324 KB Output is correct
8 Correct 359 ms 45876 KB Output is correct
9 Correct 784 ms 64372 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 13524 KB Output is correct
2 Correct 10 ms 14332 KB Output is correct
3 Correct 6 ms 13652 KB Output is correct
4 Correct 6 ms 14420 KB Output is correct
5 Correct 7 ms 14432 KB Output is correct
6 Correct 7 ms 14388 KB Output is correct
7 Correct 7 ms 14420 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
10 Correct 6 ms 13652 KB Output is correct
11 Correct 7 ms 14420 KB Output is correct
12 Correct 7 ms 13652 KB Output is correct
13 Correct 10 ms 14700 KB Output is correct
14 Correct 10 ms 13760 KB Output is correct
15 Correct 11 ms 14736 KB Output is correct
16 Correct 11 ms 14724 KB Output is correct
17 Correct 11 ms 14696 KB Output is correct
18 Correct 10 ms 14676 KB Output is correct
19 Correct 10 ms 14676 KB Output is correct
20 Correct 11 ms 14804 KB Output is correct
21 Correct 10 ms 14704 KB Output is correct
22 Correct 10 ms 14772 KB Output is correct
23 Correct 10 ms 14804 KB Output is correct
24 Correct 11 ms 14932 KB Output is correct
25 Correct 8 ms 14676 KB Output is correct
26 Correct 11 ms 14932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 13524 KB Output is correct
2 Correct 498 ms 42788 KB Output is correct
3 Correct 202 ms 31692 KB Output is correct
4 Correct 495 ms 42712 KB Output is correct
5 Correct 556 ms 44300 KB Output is correct
6 Correct 491 ms 42704 KB Output is correct
7 Correct 642 ms 48836 KB Output is correct
8 Correct 276 ms 34792 KB Output is correct
9 Correct 755 ms 58308 KB Output is correct
10 Correct 6 ms 13652 KB Output is correct
11 Correct 513 ms 42780 KB Output is correct
12 Correct 225 ms 39764 KB Output is correct
13 Correct 488 ms 47720 KB Output is correct
14 Correct 568 ms 50416 KB Output is correct
15 Correct 477 ms 49100 KB Output is correct
16 Correct 731 ms 62324 KB Output is correct
17 Correct 359 ms 45876 KB Output is correct
18 Correct 784 ms 64372 KB Output is correct
19 Correct 6 ms 13652 KB Output is correct
20 Correct 509 ms 49100 KB Output is correct
21 Correct 206 ms 39792 KB Output is correct
22 Correct 503 ms 47780 KB Output is correct
23 Correct 549 ms 49208 KB Output is correct
24 Correct 510 ms 47972 KB Output is correct
25 Correct 480 ms 49004 KB Output is correct
26 Correct 552 ms 48192 KB Output is correct
27 Correct 563 ms 50556 KB Output is correct
28 Correct 473 ms 49168 KB Output is correct
29 Correct 514 ms 47776 KB Output is correct
30 Correct 557 ms 50912 KB Output is correct
31 Correct 710 ms 57220 KB Output is correct
32 Correct 354 ms 45420 KB Output is correct
33 Correct 818 ms 64748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 13524 KB Output is correct
2 Correct 10 ms 14332 KB Output is correct
3 Correct 6 ms 13652 KB Output is correct
4 Correct 6 ms 14420 KB Output is correct
5 Correct 7 ms 14432 KB Output is correct
6 Correct 7 ms 14388 KB Output is correct
7 Correct 7 ms 14420 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
10 Correct 6 ms 13652 KB Output is correct
11 Correct 7 ms 14420 KB Output is correct
12 Correct 7 ms 13524 KB Output is correct
13 Correct 498 ms 42788 KB Output is correct
14 Correct 202 ms 31692 KB Output is correct
15 Correct 495 ms 42712 KB Output is correct
16 Correct 556 ms 44300 KB Output is correct
17 Correct 491 ms 42704 KB Output is correct
18 Correct 642 ms 48836 KB Output is correct
19 Correct 276 ms 34792 KB Output is correct
20 Correct 755 ms 58308 KB Output is correct
21 Correct 6 ms 13652 KB Output is correct
22 Correct 513 ms 42780 KB Output is correct
23 Correct 225 ms 39764 KB Output is correct
24 Correct 488 ms 47720 KB Output is correct
25 Correct 568 ms 50416 KB Output is correct
26 Correct 477 ms 49100 KB Output is correct
27 Correct 731 ms 62324 KB Output is correct
28 Correct 359 ms 45876 KB Output is correct
29 Correct 784 ms 64372 KB Output is correct
30 Correct 7 ms 13652 KB Output is correct
31 Correct 10 ms 14700 KB Output is correct
32 Correct 10 ms 13760 KB Output is correct
33 Correct 11 ms 14736 KB Output is correct
34 Correct 11 ms 14724 KB Output is correct
35 Correct 11 ms 14696 KB Output is correct
36 Correct 10 ms 14676 KB Output is correct
37 Correct 10 ms 14676 KB Output is correct
38 Correct 11 ms 14804 KB Output is correct
39 Correct 10 ms 14704 KB Output is correct
40 Correct 10 ms 14772 KB Output is correct
41 Correct 10 ms 14804 KB Output is correct
42 Correct 11 ms 14932 KB Output is correct
43 Correct 8 ms 14676 KB Output is correct
44 Correct 11 ms 14932 KB Output is correct
45 Correct 6 ms 13652 KB Output is correct
46 Correct 509 ms 49100 KB Output is correct
47 Correct 206 ms 39792 KB Output is correct
48 Correct 503 ms 47780 KB Output is correct
49 Correct 549 ms 49208 KB Output is correct
50 Correct 510 ms 47972 KB Output is correct
51 Correct 480 ms 49004 KB Output is correct
52 Correct 552 ms 48192 KB Output is correct
53 Correct 563 ms 50556 KB Output is correct
54 Correct 473 ms 49168 KB Output is correct
55 Correct 514 ms 47776 KB Output is correct
56 Correct 557 ms 50912 KB Output is correct
57 Correct 710 ms 57220 KB Output is correct
58 Correct 354 ms 45420 KB Output is correct
59 Correct 818 ms 64748 KB Output is correct
60 Correct 6 ms 13652 KB Output is correct
61 Correct 552 ms 50320 KB Output is correct
62 Correct 238 ms 39756 KB Output is correct
63 Correct 526 ms 48928 KB Output is correct
64 Correct 521 ms 50184 KB Output is correct
65 Correct 512 ms 48832 KB Output is correct
66 Correct 538 ms 50088 KB Output is correct
67 Correct 520 ms 49068 KB Output is correct
68 Correct 565 ms 51388 KB Output is correct
69 Correct 521 ms 50244 KB Output is correct
70 Correct 471 ms 48148 KB Output is correct
71 Correct 568 ms 52308 KB Output is correct
72 Correct 702 ms 57560 KB Output is correct
73 Correct 397 ms 46384 KB Output is correct
74 Correct 806 ms 67372 KB Output is correct