Submission #553834

#TimeUsernameProblemLanguageResultExecution timeMemory
553834QwertyPiFactories (JOI14_factories)C++14
0 / 100
2045 ms120240 KiB
#include "factories.h"
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
using namespace std;
typedef pair<int, int> pii;
const int N = 5e5 + 13, L = 41;
const int inf = 1LL << 60;
int tail[N], d[N], p[N], dep[N];
vector<pii> G[N];
void dfs(int v, int par = -1){
	int out = 0, son = -1;
	for(auto i : G[v]){
		if(i.fi != par){
			d[i.fi] = d[v] + i.se;
			p[i.fi] = v;
			dfs(i.fi, v);
			out++; son = i.fi;
		}
	}
	tail[v] = (out == 1 ? tail[son] : v), p[tail[v]] = p[v];
}

void dfs2(int v, int par = -1){
	for(auto i : G[v]){
		if(i.fi != par){
			if(v == tail[v]) dep[tail[i.fi]] = dep[v] + 1;
			dfs2(i.fi, v);
		}
	}
}

struct state{
	int v, dis, colour;
	bool operator< (const state& o) const{
		return v < o.v || v == o.v && dis < o.dis;
	}
};

vector<state> qry[N];

void Init(int32_t N, int32_t A[], int32_t B[], int32_t D[]) {
	for(int i = 0; i < N - 1; i++){
		G[B[i]].pb({A[i], D[i]});
		G[A[i]].pb({B[i], D[i]});
	}
	dfs(0);
	dfs2(0);
}

long long Query(int32_t S, int32_t X[], int32_t T, int32_t Y[]) {
	for(int j = L - 1; j >= 0; j--) qry[j].clear();
	for(int j = 0; j < S; j++){
		int v = X[j];
		qry[dep[tail[v]]].pb({tail[v], d[v] - d[tail[v]], 0});
	}
	for(int j = 0; j < T; j++){
		int v = Y[j];
		qry[dep[tail[v]]].pb({tail[v], d[v] - d[tail[v]], 1});
	}
	int ans = inf;
	for(int j = L - 1; j >= 0; j--){
		vector<state> tmp, tmp2;
		sort(qry[j].begin(), qry[j].end());
		for(int i = 0; i + 1 < qry[j].size(); i++){
			if(qry[j][i].v == qry[j][i + 1].v && qry[j][i].colour + qry[j][i + 1].colour == 1 && qry[j][i].dis <= 0 && qry[j][i + 1].dis <= 0) 
				ans = min(ans, qry[j][i + 1].dis - qry[j][i].dis);
		}
		for(auto k : qry[j]){
			bool used1 = false, used2 = false;
			if(tmp2.size() >= 1 && tmp2.back().v == k.v && tmp2.back().colour + k.colour == 1) ans = min(ans, abs(tmp2.back().dis) + abs(k.dis));
			if(tmp2.size() >= 2 && tmp2[tmp2.size() - 2].v == k.v && tmp2[tmp2.size() - 2].colour + k.colour == 1) ans = min(ans, abs(tmp2[tmp2.size() - 2].dis) + abs(k.dis));
			if(tmp.size() >= 1 && tmp[tmp.size() - 1].v == k.v && tmp[tmp.size() - 1].colour == k.colour){
				tmp[tmp.size() - 1].dis = min(tmp[tmp.size() - 1].dis, k.dis); used1 = true;
			}
			if(tmp.size() >= 2 && tmp[tmp.size() - 2].v == k.v && tmp[tmp.size() - 2].colour == k.colour){
				tmp[tmp.size() - 2].dis = min(tmp[tmp.size() - 2].dis, k.dis); used1 = true;
			}
			if(tmp2.size() >= 1 && tmp2[tmp2.size() - 1].v == k.v && tmp2[tmp2.size() - 1].colour == k.colour){
				tmp2[tmp2.size() - 1].dis = min(abs(tmp2[tmp2.size() - 1].dis), abs(k.dis)); used2 = true;
			}
			if(tmp2.size() >= 2 && tmp2[tmp2.size() - 2].v == k.v && tmp2[tmp2.size() - 2].colour == k.colour){
				tmp2[tmp2.size() - 2].dis = min(abs(tmp2[tmp2.size() - 2].dis), abs(k.dis)); used2 = true;
			}
			if(!used1) tmp.pb(k);
			if(!used2) tmp2.pb(k);
		}
		if(j > 0){
			for(auto k : tmp){
				qry[j - 1].pb({p[k.v], k.dis + d[k.v] - d[p[k.v]], k.colour});
			}
		}
	}
	return ans;
}

Compilation message (stderr)

factories.cpp: In member function 'bool state::operator<(const state&) const':
factories.cpp:39:30: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   39 |   return v < o.v || v == o.v && dis < o.dis;
      |                     ~~~~~~~~~^~~~~~~~~~~~~~
factories.cpp: In function 'long long int Query(int32_t, int32_t*, int32_t, int32_t*)':
factories.cpp:68:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<state>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |   for(int i = 0; i + 1 < qry[j].size(); i++){
      |                  ~~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...