Submission #554071

#TimeUsernameProblemLanguageResultExecution timeMemory
554071QwertyPiFactories (JOI14_factories)C++14
Compilation error
0 ms0 KiB
#include "factories.h"		#include "factories.h"
#include <bits/stdc++.h>		#include <bits/stdc++.h>
#define int long long		#define int long long
#define fi first		#define fi first
#define se second		#define se second
#define pb push_back		#define pb push_back
#define mp make_pair		#define mp make_pair
using namespace std;		using namespace std;
typedef pair<int, int> pii;		typedef pair<int, int> pii;
const int N = 1e4 + 13, L = 20;		const int N = 5e5 + 13, L = 20;
const int inf = 1LL << 60;		const int inf = 1LL << 60;
int d[N], p[N], dep[N], sz[N];		int d[N], p[N], dep[N], sz[N];
vector<pii> G[N];		vector<pii> G[N];
int timer = 0, timer2 = 0, op[N * 2], ed[N * 2], op2[N * 2], ed2[N * 2];		int timer = 0, timer2 = 0, op[N * 2], ed[N * 2], op2[N * 2], ed2[N * 2];
int euler[N], euler2[N * 2];		int euler[N], euler2[N * 2];
int st[N][L];		int st[N][L];
int n;		int n;
 		
void dfs(int v, int par = -1){		void dfs(int v, int par = -1){
	euler[timer] = v, op[v] = timer++, sz[v] = 1;			euler[timer] = v, op[v] = timer++, sz[v] = 1;
	euler2[timer2] = v, op2[v] = timer2++;			euler2[timer2] = v, op2[v] = timer2++;
	int out = 0, son = -1;			int out = 0, son = -1;
	for(auto i : G[v]){			for(auto i : G[v]){
		if(i.fi != par){				if(i.fi != par){
			d[i.fi] = d[v] + i.se;					d[i.fi] = d[v] + i.se;
			p[i.fi] = v;					p[i.fi] = v;
			dep[i.fi] = dep[v] + 1;					dep[i.fi] = dep[v] + 1;
			dfs(i.fi, v);					dfs(i.fi, v);
			euler2[timer2++] = v;					euler2[timer2++] = v;
			out++; son = i.fi;					out++; son = i.fi;
			sz[v] += sz[i.fi];					sz[v] += sz[i.fi];
		}				}
	}			}
	ed[v] = timer;			ed[v] = timer;
	ed2[v] = timer2 - 1;			ed2[v] = timer2 - 1;
}		}
 		
struct Fenwick{		struct Fenwick{
	int bit[N];			int bit[N];
	void upd(int p, int v){			void upd(int p, int v){
		p++;				p++;
		for(int i = p; i < N; i += i & -i){				for(int i = p; i < N; i += i & -i){
			bit[i] += v;					bit[i] += v;
		}				}
	}	
	int qry(int p){	
		p++;	
		int ret = 0;	
		for(int i = p; i; i -= i & -i){	
			ret += bit[i];	
		}	
		return ret;	
	}	
		
	int qry_pos(int v){ // 1-base, >= 1	
		int ret = 0, val = 0;	
		for(int j = 19; j >= 0; j--){	
			if(ret + (1 << j) >= N) continue;	
			if(val + bit[ret + (1 << j)] < v) val += bit[ret + (1 << j)], ret += (1 << j);	
		}	
		return ret;	
	}	
} c0, c1;	
 	
void bl(int n){	
	for(int i = 0; i < n * 2 - 1; i++) st[i][0] = euler2[i];	
	for(int j = 1; j < 20; j++){	
		for(int i = 0; i <= n * 2 - 1 - (1 << j); i++){	
			st[i][j] = dep[st[i][j - 1]] < dep[st[i + (1 << j - 1)][j - 1]] ? st[i][j - 1] : st[i + (1 << j - 1)][j - 1];	
		}	
	}	
}	
 	
int lca(int x, int y){	
	int a = min(op2[x], op2[y]), b = max(ed2[x], ed2[y]);	
	int l = __lg(b - a + 1);	
	int ret = dep[st[a][l]] < dep[st[b - (1 << l) + 1][l]] ? st[a][l] : st[b - (1 << l) + 1][l];	
	return ret;	
}	
 	
struct state{	
	int v, dis, colour;	
	bool operator< (const state& o) const{	
		return v < o.v;	
	}	
};	
 	
vector<state> qry[N];	
 	
void Init(int32_t N, int32_t A[], int32_t B[], int32_t D[]) {	
	n = N;	
	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);	
	bl(N);	
}	
 	
long long Query(int32_t S, int32_t X[], int32_t T, int32_t Y[]) {	
	for(int j = N - 1; j >= 0; j--) qry[j].clear();	
	for(int j = 0; j < S; j++){	
		int v = X[j];	
		qry[dep[v]].pb({v, d[v] - d[v], 0});	
	}	
	for(int j = 0; j < T; j++){	
		int v = Y[j];	
		qry[dep[v]].pb({v, d[v] - d[v], 1});	
	}	
	for(int j = 0; j < S; j++) c0.upd(op[X[j]], 1);	
	for(int j = 0; j < T; j++) c1.upd(op[Y[j]], 1);	
	int ans = inf;	
	for(j; pq.size();){
		j = pq.top(); pq.pop(); in_pq[j] = false;
		vector<state> tmp;	
		sort(qry[j].begin(), qry[j].end());	
		for(auto k : qry[j]){	
			bool used = false;	
			if(tmp.size() >= 1 && tmp.back().v == k.v && tmp.back().colour + k.colour == 1) ans = min(ans, tmp.back().dis + k.dis);	
			if(tmp.size() >= 2 && tmp[tmp.size() - 2].v == k.v && tmp[tmp.size() - 2].colour + k.colour == 1) ans = min(ans, tmp[tmp.size() - 2].dis + 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); used = 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); used = true;	
			}	
			if(!used){	
				tmp.pb(k);	
			}	
		}  	
		if(j > 0){	
			for(auto k : tmp){	
				int _lca = 0;	
				if(k.colour){	
					int l = c0.qry_pos(c0.qry(op[k.v] - 1)), r = c0.qry_pos(c0.qry(op[k.v] + sz[k.v] - 1) + 1);	
					if(l < 0 && r > n - 1) _lca = 0;	
					else if(l < 0 || r > n - 1) _lca = l < 0 ? lca(k.v, euler[r]) : lca(euler[l], k.v);	
					else{	
						int llca = lca(euler[l], k.v), rlca = lca(k.v, euler[r]);	
						_lca = (dep[llca] > dep[rlca] ? llca : rlca);	
					}	
						
				}else{	
					int l = c1.qry_pos(c1.qry(op[k.v] - 1)), r = c1.qry_pos(c1.qry(op[k.v] + sz[k.v] - 1) + 1);	
					if(l < 0 && r > n - 1) _lca = 0;	
					else if(l < 0 || r > n - 1) _lca = l < 0 ? lca(k.v, euler[r]) : lca(euler[l], k.v);	
					else{	
						int llca = lca(euler[l], k.v), rlca = lca(k.v, euler[r]);	
						_lca = (dep[llca] > dep[rlca] ? llca : rlca);	
					}	
				}	
				if(_lca == k.v) _lca = p[k.v];
				if(!in_pq[dep[_lca]]) in_pq[dep[_lca]] = true, qry[dep[_lca]].clear(), pq.push(dep[_lca]);
				qry[dep[_lca]].pb({_lca, k.dis + d[k.v] - d[_lca], k.colour});
			}	
		}	
	}	
	for(int j = 0; j < S; j++) c0.upd(op[X[j]], -1);	
	for(int j = 0; j < T; j++) c1.upd(op[Y[j]], -1);	
	return ans;	
}

Compilation message (stderr)

factories.cpp:1:25: warning: extra tokens at end of #include directive
    1 | #include "factories.h"  #include "factories.h"
      |                         ^
factories.cpp:2:27: warning: extra tokens at end of #include directive
    2 | #include <bits/stdc++.h>  #include <bits/stdc++.h>
      |                           ^
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:9:14: note: in expansion of macro 'int'
    9 | typedef pair<int, int> pii;  typedef pair<int, int> pii;
      |              ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:9:19: note: in expansion of macro 'int'
    9 | typedef pair<int, int> pii;  typedef pair<int, int> pii;
      |                   ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:9:43: note: in expansion of macro 'int'
    9 | typedef pair<int, int> pii;  typedef pair<int, int> pii;
      |                                           ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:9:48: note: in expansion of macro 'int'
    9 | typedef pair<int, int> pii;  typedef pair<int, int> pii;
      |                                                ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:10:7: note: in expansion of macro 'int'
   10 | const int N = 1e4 + 13, L = 20;  const int N = 5e5 + 13, L = 20;
      |       ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:10:40: note: in expansion of macro 'int'
   10 | const int N = 1e4 + 13, L = 20;  const int N = 5e5 + 13, L = 20;
      |                                        ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:11:7: note: in expansion of macro 'int'
   11 | const int inf = 1LL << 60;  const int inf = 1LL << 60;
      |       ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:11:35: note: in expansion of macro 'int'
   11 | const int inf = 1LL << 60;  const int inf = 1LL << 60;
      |                                   ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:12:1: note: in expansion of macro 'int'
   12 | int d[N], p[N], dep[N], sz[N];  int d[N], p[N], dep[N], sz[N];
      | ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:12:33: note: in expansion of macro 'int'
   12 | int d[N], p[N], dep[N], sz[N];  int d[N], p[N], dep[N], sz[N];
      |                                 ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:14:1: note: in expansion of macro 'int'
   14 | int timer = 0, timer2 = 0, op[N * 2], ed[N * 2], op2[N * 2], ed2[N * 2];  int timer = 0, timer2 = 0, op[N * 2], ed[N * 2], op2[N * 2], ed2[N * 2];
      | ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:14:75: note: in expansion of macro 'int'
   14 | int timer = 0, timer2 = 0, op[N * 2], ed[N * 2], op2[N * 2], ed2[N * 2];  int timer = 0, timer2 = 0, op[N * 2], ed[N * 2], op2[N * 2], ed2[N * 2];
      |                                                                           ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:15:1: note: in expansion of macro 'int'
   15 | int euler[N], euler2[N * 2];  int euler[N], euler2[N * 2];
      | ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:15:31: note: in expansion of macro 'int'
   15 | int euler[N], euler2[N * 2];  int euler[N], euler2[N * 2];
      |                               ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:16:1: note: in expansion of macro 'int'
   16 | int st[N][L];  int st[N][L];
      | ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:16:16: note: in expansion of macro 'int'
   16 | int st[N][L];  int st[N][L];
      |                ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:17:1: note: in expansion of macro 'int'
   17 | int n;  int n;
      | ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:17:9: note: in expansion of macro 'int'
   17 | int n;  int n;
      |         ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:19:10: note: in expansion of macro 'int'
   19 | void dfs(int v, int par = -1){  void dfs(int v, int par = -1){
      |          ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:19:17: note: in expansion of macro 'int'
   19 | void dfs(int v, int par = -1){  void dfs(int v, int par = -1){
      |                 ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:19:42: note: in expansion of macro 'int'
   19 | void dfs(int v, int par = -1){  void dfs(int v, int par = -1){
      |                                          ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:19:49: note: in expansion of macro 'int'
   19 | void dfs(int v, int par = -1){  void dfs(int v, int par = -1){
      |                                                 ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:22:2: note: in expansion of macro 'int'
   22 |  int out = 0, son = -1;   int out = 0, son = -1;
      |  ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:22:27: note: in expansion of macro 'int'
   22 |  int out = 0, son = -1;   int out = 0, son = -1;
      |                           ^~~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:24:8: note: in expansion of macro 'fi'
   24 |   if(i.fi != par){    if(i.fi != par){
      |        ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:24:28: note: in expansion of macro 'fi'
   24 |   if(i.fi != par){    if(i.fi != par){
      |                            ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:25:8: note: in expansion of macro 'fi'
   25 |    d[i.fi] = d[v] + i.se;     d[i.fi] = d[v] + i.se;
      |        ^~
factories.cpp:5:20: error: stray '#' in program
    5 | #define se second  #define se second
      |                    ^
factories.cpp:25:23: note: in expansion of macro 'se'
   25 |    d[i.fi] = d[v] + i.se;     d[i.fi] = d[v] + i.se;
      |                       ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:25:35: note: in expansion of macro 'fi'
   25 |    d[i.fi] = d[v] + i.se;     d[i.fi] = d[v] + i.se;
      |                                   ^~
factories.cpp:5:20: error: stray '#' in program
    5 | #define se second  #define se second
      |                    ^
factories.cpp:25:50: note: in expansion of macro 'se'
   25 |    d[i.fi] = d[v] + i.se;     d[i.fi] = d[v] + i.se;
      |                                                  ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:26:8: note: in expansion of macro 'fi'
   26 |    p[i.fi] = v;     p[i.fi] = v;
      |        ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:26:25: note: in expansion of macro 'fi'
   26 |    p[i.fi] = v;     p[i.fi] = v;
      |                         ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:27:10: note: in expansion of macro 'fi'
   27 |    dep[i.fi] = dep[v] + 1;     dep[i.fi] = dep[v] + 1;
      |          ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:27:38: note: in expansion of macro 'fi'
   27 |    dep[i.fi] = dep[v] + 1;     dep[i.fi] = dep[v] + 1;
      |                                      ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:28:10: note: in expansion of macro 'fi'
   28 |    dfs(i.fi, v);     dfs(i.fi, v);
      |          ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:28:28: note: in expansion of macro 'fi'
   28 |    dfs(i.fi, v);     dfs(i.fi, v);
      |                            ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:30:19: note: in expansion of macro 'fi'
   30 |    out++; son = i.fi;     out++; son = i.fi;
      |                   ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:30:42: note: in expansion of macro 'fi'
   30 |    out++; son = i.fi;     out++; son = i.fi;
      |                                          ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:31:18: note: in expansion of macro 'fi'
   31 |    sz[v] += sz[i.fi];     sz[v] += sz[i.fi];
      |                  ^~
factories.cpp:4:19: error: stray '#' in program
    4 | #define fi first  #define fi first
      |                   ^
factories.cpp:31:41: note: in expansion of macro 'fi'
   31 |    sz[v] += sz[i.fi];     sz[v] += sz[i.fi];
      |                                         ^~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:39:2: note: in expansion of macro 'int'
   39 |  int bit[N];   int bit[N];
      |  ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:39:16: note: in expansion of macro 'int'
   39 |  int bit[N];   int bit[N];
      |                ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:40:11: note: in expansion of macro 'int'
   40 |  void upd(int p, int v){   void upd(int p, int v){
      |           ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:40:18: note: in expansion of macro 'int'
   40 |  void upd(int p, int v){   void upd(int p, int v){
      |                  ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:40:37: note: in expansion of macro 'int'
   40 |  void upd(int p, int v){   void upd(int p, int v){
      |                                     ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:40:44: note: in expansion of macro 'int'
   40 |  void upd(int p, int v){   void upd(int p, int v){
      |                                            ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:42:7: note: in expansion of macro 'int'
   42 |   for(int i = p; i < N; i += i & -i){    for(int i = p; i < N; i += i & -i){
      |       ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:42:46: note: in expansion of macro 'int'
   42 |   for(int i = p; i < N; i += i & -i){    for(int i = p; i < N; i += i & -i){
      |                                              ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:46:2: note: in expansion of macro 'int'
   46 |  int qry(int p){
      |  ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:46:10: note: in expansion of macro 'int'
   46 |  int qry(int p){
      |          ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:48:3: note: in expansion of macro 'int'
   48 |   int ret = 0;
      |   ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:49:7: note: in expansion of macro 'int'
   49 |   for(int i = p; i; i -= i & -i){
      |       ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:55:2: note: in expansion of macro 'int'
   55 |  int qry_pos(int v){ // 1-base, >= 1
      |  ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:55:14: note: in expansion of macro 'int'
   55 |  int qry_pos(int v){ // 1-base, >= 1
      |              ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:56:3: note: in expansion of macro 'int'
   56 |   int ret = 0, val = 0;
      |   ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:57:7: note: in expansion of macro 'int'
   57 |   for(int j = 19; j >= 0; j--){
      |       ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:65:9: note: in expansion of macro 'int'
   65 | void bl(int n){
      |         ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:66:6: note: in expansion of macro 'int'
   66 |  for(int i = 0; i < n * 2 - 1; i++) st[i][0] = euler2[i];
      |      ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:67:6: note: in expansion of macro 'int'
   67 |  for(int j = 1; j < 20; j++){
      |      ^~~
factories.cpp:3:24: error: stray '#' in program
    3 | #define int long long  #define int long long
      |                        ^
factories.cpp:68:7: note: in expansion of macro 'int'
   68 |   for(int i = 0; i <= n * 2 - 1 - (1 << j); i++){
      |       ^~~
factories.cpp:3:24: error: stray '#' in program