Submission #102516

#TimeUsernameProblemLanguageResultExecution timeMemory
102516BruteforcemanDesignated Cities (JOI19_designated_cities)C++11
100 / 100
819 ms54380 KiB
#include <bits/stdc++.h>
using namespace std;
int n;
int l[500010], r[500010], a[500010], b[500010];
vector <int> g[500010];
long long sum;

typedef pair <long long, int> pii;
long long ans[500010];
pii opt[500010];
long long cost[500010];
vector <int> ls;
int root;
int Px, Py;

const long long inf = 1e17;

void leaves(int x, int par) {
	bool leaf = true;
	for(auto i : g[x]) {
		int y = l[i] ^ r[i] ^ x;
		if(y - par) {
			leaves(y, x);
			leaf = true;
		}
	}
	if(leaf) {
		ls.push_back(x);
	}
}

bool cmp(int x, int y) {
	return cost[x] > cost[y];
}

void dfs(int x, int par, long long add) {
	ans[1] = max(ans[1], add);

	opt[x] = pii(0, x);
	vector <pii> can;
	for(auto i : g[x]) {
		int y = l[i] ^ r[i] ^ x;
		int val = (y == r[i]) ? a[i] : b[i];
		if(y == par) continue;
		sum += val;
		dfs(y, x, add + val - (a[i] ^ b[i] ^ val));
		pii nw = pii(opt[y].first + val, opt[y].second);
		opt[x] = max(opt[x], nw);
		can.push_back(nw);
	}
	sort(can.begin(), can.end(), greater <pii> ());
	if(can.size() < 2) return ;
	if(ans[2] <= can[0].first + can[1].first + add) {
		ans[2] = can[0].first + can[1].first + add;
		root = x;
		Px = can[0].second;
		Py = can[1].second;
	}
}

void solve(int x, int par, long long add) {
	opt[x] = pii(0, x);
	for(auto i : g[x]) {
		int y = l[i] ^ r[i] ^ x;
		int val = (y == r[i]) ? a[i] : b[i];
		if(y == par) continue;
		sum += val;
		solve(y, x, add + val - (a[i] ^ b[i] ^ val));
		pii nw = pii(opt[y].first + val, opt[y].second);
		opt[x] = max(opt[x], nw);
		cost[opt[y].second] += val;
	}
}



int main() {
    scanf("%d", &n);
    for(int i = 1; i < n; i++) {
        scanf("%d %d %d %d", &l[i], &r[i], &a[i], &b[i]);
        g[l[i]].emplace_back(i);
        g[r[i]].emplace_back(i);
    }
    root = 1;
    while(root < n && g[root].size() == 1) {
    	++root;
    }
    dfs(root, 0, 0);
    if(n == 2) {
    	ans[2] = sum;
    } 
    ans[1] = sum - ans[1];
    ans[2] = sum - ans[2];

    sum = 0;
    solve(root, 0, 0);
    leaves(root, 0);
    
    long long Pcx = cost[Px];
    long long Pcy = cost[Py];
    cost[Px] = inf;
    cost[Py] = inf;
    sort(ls.begin(), ls.end(), cmp);
    cost[Px] = Pcx;
    cost[Py] = Pcy;

    long long tot = 0;
    for(int i = 1; i <= ls.size(); i++) {
    	tot += cost[ls[i - 1]];
    	if(i > 2) {
    		ans[i] = max(ans[i], tot);
    	}
    } 
    for(int i = 3; i <= ls.size(); i++) {
    	ans[i] = sum - ans[i];
    }

    int q;
    scanf("%d", &q);

    while(q--) {
    	int x;
    	scanf("%d", &x);
    	printf("%lld\n", ans[x]);
    }
    return 0;
}

Compilation message (stderr)

designated_cities.cpp: In function 'int main()':
designated_cities.cpp:108:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 1; i <= ls.size(); i++) {
                    ~~^~~~~~~~~~~~
designated_cities.cpp:114:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 3; i <= ls.size(); i++) {
                    ~~^~~~~~~~~~~~
designated_cities.cpp:78:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
designated_cities.cpp:80:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d %d", &l[i], &r[i], &a[i], &b[i]);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
designated_cities.cpp:119:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &q);
     ~~~~~^~~~~~~~~~
designated_cities.cpp:123:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
      scanf("%d", &x);
      ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...