답안 #94364

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
94364 2019-01-18T01:36:12 Z jasony123123 Uzastopni (COCI15_uzastopni) C++11
160 / 160
235 ms 7796 KB
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <unordered_map>
#include <array>
//#include <ext/pb_ds/tree_policy.hpp>
//#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
//using namespace __gnu_pbds;

#define FOR(i,start,end) for(int i=start;i<(int)(end);i++)
#define FORE(i,start,end) for(int i=start;i<=(int)end;i++)
#define RFOR(i,start,end) for(int i = start; i>end; i--)
#define RFORE(i,start,end) for(int i = start; i>=end; i--)
#define all(a) a.begin(), a.end()
#define mt make_tuple
#define mp make_pair
#define v vector
#define sf scanf
#define pf printf
#define dvar(x) cout << #x << " := " << x << "\n"
#define darr(x,n) FOR(i,0,n) cout << #x << "[" << i << "]" << " := " << x[i] << "\n"

typedef long long ll;
typedef long double ld;
typedef pair<int, int > pii;
typedef pair<ll, ll> pll;
//template <class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<class T> void minn(T &a, T b) { a = min(a, b); }
template<class T> void maxx(T &a, T b) { a = max(a, b); }

void io() {
#ifdef LOCAL_PROJECT 
	freopen("input.in", "r", stdin); freopen("output.out", "w", stdout);
#else 
	/* online submission */

#endif 
	ios_base::sync_with_stdio(false); cin.tie(NULL);
}

const ll MOD = 1000000007LL;
const ll PRIME = 105943LL;
const ll INF = 1e18;
/**************************COCI15 R1 P6 uzastopni************************************/
const int SZ = 10000;
typedef array<bitset<100>, 100> dpt;
int N, J[SZ];
v<int> adj[SZ];
v<pii> dp[SZ];

dpt trans, curdp;

void dfs(int x, int p) {
	for (auto c : adj[x]) if (c != p) {
		dfs(c, x);
	}

	FOR(i, 0, 100) trans[i].reset(), curdp[i].reset();
	for (auto c : adj[x]) if (c != p) {
		for (auto s : dp[c]) trans[s.first][s.second] = 1;
	}
	RFORE(l, 99, J[x] + 1) {
		curdp[l] = trans[l];
		FORE(r, l, 99) if (trans[l][r] && r + 1 <= 99) {
			curdp[l] |= curdp[r + 1];
		}
	}
	curdp[J[x]][J[x]] = 1;
	if (J[x] != 99)
		curdp[J[x]] |= curdp[J[x] + 1];
	RFORE(l, J[x] - 1, 0) {
		FORE(r, l, J[x] - 1) if (trans[l][r]) {
			curdp[l][r] = 1;
			curdp[l] |= curdp[r + 1];
		}
	}
	FOR(l, 0, 100) FOR(r, l, 100) if (curdp[l][r] && r < J[x] || J[x] < l)
		curdp[l][r] = 0;
	FOR(l, 0, 100) FOR(r, l, 100) if (curdp[l][r])
		dp[x].push_back({ l,r });
}

int main() {
	io();
	cin >> N;
	FOR(i, 0, N) {
		cin >> J[i];
		J[i]--;
	}
	FOR(i, 0, N - 1) {
		int a, b; cin >> a >> b;
		adj[a - 1].push_back(b - 1), adj[b - 1].push_back(a - 1);
	}
	dfs(0, -1);
	cout << dp[0].size() << "\n";
}

Compilation message

uzastopni.cpp: In function 'void dfs(int, int)':
uzastopni.cpp:77:48: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
  FOR(l, 0, 100) FOR(r, l, 100) if (curdp[l][r] && r < J[x] || J[x] < l)
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 760 KB Output is correct
2 Correct 4 ms 888 KB Output is correct
3 Correct 4 ms 760 KB Output is correct
4 Correct 4 ms 760 KB Output is correct
5 Correct 4 ms 888 KB Output is correct
6 Correct 4 ms 892 KB Output is correct
7 Correct 4 ms 888 KB Output is correct
8 Correct 4 ms 760 KB Output is correct
9 Correct 4 ms 760 KB Output is correct
10 Correct 4 ms 888 KB Output is correct
11 Correct 227 ms 1528 KB Output is correct
12 Correct 229 ms 1528 KB Output is correct
13 Correct 235 ms 1528 KB Output is correct
14 Correct 209 ms 7672 KB Output is correct
15 Correct 209 ms 7796 KB Output is correct
16 Correct 208 ms 7672 KB Output is correct
17 Correct 227 ms 1500 KB Output is correct
18 Correct 232 ms 1572 KB Output is correct
19 Correct 201 ms 4000 KB Output is correct
20 Correct 203 ms 4036 KB Output is correct