Submission #814827

# Submission time Handle Problem Language Result Execution time Memory
814827 2023-08-08T10:19:46 Z WonderfulWhale Jail (JOI22_jail) C++17
0 / 100
3237 ms 31016 KB
#include <bits/stdc++.h>
using namespace std;

#define int int64_t
#define pii pair<int, int>
#define st first
#define nd second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()

struct SegTree {
	static const int T = 1<<17;
	set<int> t[2*T];
	vector<int> query(int l, int r) {
		l+=T, r+=T;
		vector<int> ret;
		for(int x:t[l]) ret.pb(x);
		if(l!=r) for(int x:t[r]) ret.pb(x);
		while(l/2!=r/2) {
			if(l%2==0) for(int x:t[l+1]) ret.pb(x);
			if(r%2==1) for(int x:t[r-1]) ret.pb(x);
			l/=2;
			r/=2;
		}
		return ret;
	}
	void add(int x, int val) {
		x+=T;
		while(x) {
			t[x].insert(val);
			x/=2;
		}
	}
	void remove(int x, int val) {
		x+=T;
		while(x) {
			t[x].erase(val);
			x/=2;
		}
	}
};

vector<int> G[120009];
vector<int> G2[120009];
int tin[120009], tout[120009], T;
int jp2[120009][20];
int deg[120009];
pii tab[120009];
int col[120009];
int dep[120009];
int p[120009];
int heavy[120009];
int pos[120009], P;
int head[120009];


int dfs(int x, int y) {
	p[x] = y;
	dep[x] = dep[y]+1;
	int sz = 1, max_sz=0;
	tin[x] = ++T;
	jp2[x][0] = y;
	for(int i=1;i<20;i++) jp2[x][i] = jp2[jp2[x][i-1]][i-1];
	for(int z:G[x]) if(z!=y) {
		int c_sz = dfs(z, x);
		//cout << x << " " << z << " " << c_sz << "\n";
		//cout << max_sz << "\n";
		sz += c_sz;
		if(c_sz>max_sz) {
			max_sz = c_sz;
			//cout << "setting heavy to: " << z << "\n";
			heavy[x] = z;
		}
	}
	tout[x] = ++T;
	return sz;
}

void decompose(int x, int h) {
	head[x] = h;
	pos[x] = ++P;
	//cout << "pos: " << x << " " << pos[x] << "\n";
	//cout << heavy[x] << "\n";
	if(heavy[x]) {
		decompose(heavy[x], h);
	}
	for(int y:G[x]) {
		if(y!=p[x]&&y!=heavy[x]) decompose(y, y);
	}
}

bool is_ancestor(int x, int y) {
	return tin[x]<=tin[y]&&tout[x]>=tout[y];
}

int lca(int x, int y) {
	if(is_ancestor(x, y)) return x;
	if(is_ancestor(y, x)) return y;
	for(int i=19;i>=0;i--) {
		if(!is_ancestor(jp2[x][i], y)) {
			x = jp2[x][i];
		}
	}
	return jp2[x][0];
}

bool is_on_path(int x, int a, int b) {
	return is_ancestor(a, x)&&is_ancestor(x, b);
}

bool f(int x, int a, int b) {
	int y = lca(a, b);
	//cerr << "lca: " << a << " " << b << " " << y << "\n";
	//cerr << "checking: " << x << " " << a << " " << b << " " << (is_on_path(x, y, a)||is_on_path(x, y, b)) << "\n";
	return is_on_path(x, y, a)||is_on_path(x, y, b);
}

SegTree seg;

vector<int> hld_query(int a, int b) {
	//cout << "hld_query: " << a << " " << b << "\n";
	vector<int> ret;
	for (; head[a] != head[b]; b=p[head[b]]) {
		if (dep[head[a]] > dep[head[b]]) swap(a, b);
		for(int x:seg.query(pos[head[b]], pos[b])) ret.pb(x);
	}
	if (dep[a] > dep[b]) swap(a, b);
	for(int x:seg.query(pos[a], pos[b])) ret.pb(x);
	return ret;
}

bool dfs2(int x) {
	//cout << "dfs: " << x << "\n";
	col[x] = 1;
	vector<int> v = hld_query(tab[x].st, tab[x].nd);
	for(int y:v){ 
		if(y==x) continue;
		//cout << "sprawdzam: "<< y << "\n";
		if(col[y]) return false;
	}
	for(int y:v) {
		if(y==x) continue;
		if(!dfs2(y)) return false;
	}
	col[x] = 2;
	seg.remove(pos[tab[x].st], x);
	return true;
}

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

	int q=1;
	cin >> q;
	while(q--) {
		int n, m;
		cin >> n;
		for(int i=1;i<=n;i++) {
			G[i].clear();
			head[i] = 0;
			heavy[i] = 0;
			dep[i] = 0;
			p[i] = 0;
		}
		for(int i=0;i<n-1;i++) {
			int a, b;
			cin >> a >> b;
			G[a].pb(b);
			G[b].pb(a);
		}
		tin[0] = T = 0;
		dfs(1, 0);
		decompose(1, 1);
		tout[0] = T;
		cin >> m;
		for(int i=0;i<m;i++) {
			G2[i].clear();
			deg[i] = 0;
			col[i] = 0;
		}
		seg = SegTree();
		for(int i=0;i<m;i++) {
			cin >> tab[i].st >> tab[i].nd;
			seg.add(pos[tab[i].st], i);
		}
		bool ans = true;
		for(int i=0;i<m;i++) {
			if(!col[i]) {
				ans&=dfs2(i);
			}
		}
		if(ans) {
			cout << "Yes\n";
		} else {
			cout << "No\n";
		}
	}
}
# Verdict Execution time Memory Grader output
1 Correct 19 ms 30588 KB Output is correct
2 Correct 29 ms 30652 KB Output is correct
3 Correct 20 ms 30648 KB Output is correct
4 Incorrect 1419 ms 31016 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 18 ms 30548 KB Output is correct
2 Correct 22 ms 30636 KB Output is correct
3 Incorrect 79 ms 30748 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 18 ms 30548 KB Output is correct
2 Correct 22 ms 30636 KB Output is correct
3 Incorrect 79 ms 30748 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 18 ms 30548 KB Output is correct
2 Correct 22 ms 30636 KB Output is correct
3 Incorrect 79 ms 30748 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 18 ms 30548 KB Output is correct
2 Correct 22 ms 30636 KB Output is correct
3 Incorrect 79 ms 30748 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 20 ms 30548 KB Output is correct
2 Correct 20 ms 30584 KB Output is correct
3 Correct 26 ms 30548 KB Output is correct
4 Correct 20 ms 30572 KB Output is correct
5 Incorrect 3237 ms 30692 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 19 ms 30588 KB Output is correct
2 Correct 29 ms 30652 KB Output is correct
3 Correct 20 ms 30648 KB Output is correct
4 Incorrect 1419 ms 31016 KB Output isn't correct
5 Halted 0 ms 0 KB -