답안 #94363

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
94363 2019-01-18T01:35:21 Z jasony123123 Uzastopni (COCI15_uzastopni) C++11
136 / 160
240 ms 33792 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];

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

	dpt trans;
	for (auto c : adj[x]) if (c != p) {
		for (auto s : dp[c]) trans[s.first][s.second] = 1;
	}
	dpt curdp;
	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:76: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 4 ms 888 KB Output is correct
2 Correct 4 ms 888 KB Output is correct
3 Correct 4 ms 888 KB Output is correct
4 Correct 4 ms 760 KB Output is correct
5 Correct 5 ms 888 KB Output is correct
6 Correct 4 ms 1016 KB Output is correct
7 Correct 5 ms 1144 KB Output is correct
8 Correct 5 ms 1016 KB Output is correct
9 Correct 4 ms 760 KB Output is correct
10 Correct 4 ms 760 KB Output is correct
11 Correct 233 ms 1544 KB Output is correct
12 Correct 236 ms 1664 KB Output is correct
13 Correct 239 ms 1672 KB Output is correct
14 Runtime error 106 ms 33792 KB Execution killed with signal 9 (could be triggered by violating memory limits)
15 Runtime error 107 ms 33792 KB Execution killed with signal 9 (could be triggered by violating memory limits)
16 Runtime error 107 ms 33792 KB Execution killed with signal 9 (could be triggered by violating memory limits)
17 Correct 239 ms 1608 KB Output is correct
18 Correct 240 ms 1532 KB Output is correct
19 Correct 208 ms 3960 KB Output is correct
20 Correct 206 ms 4048 KB Output is correct