답안 #94356

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
94356 2019-01-18T01:24:02 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) {
	dpt trans;
	for (auto c : adj[x]) if (c != p) {
		dfs(c, x);
		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:73: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 888 KB Output is correct
2 Correct 4 ms 760 KB Output is correct
3 Correct 4 ms 888 KB Output is correct
4 Correct 4 ms 916 KB Output is correct
5 Correct 5 ms 888 KB Output is correct
6 Correct 5 ms 1016 KB Output is correct
7 Correct 4 ms 1016 KB Output is correct
8 Correct 5 ms 1016 KB Output is correct
9 Correct 4 ms 888 KB Output is correct
10 Correct 4 ms 888 KB Output is correct
11 Correct 233 ms 1604 KB Output is correct
12 Correct 238 ms 1528 KB Output is correct
13 Correct 240 ms 1784 KB Output is correct
14 Runtime error 111 ms 33792 KB Execution killed with signal 9 (could be triggered by violating memory limits)
15 Runtime error 111 ms 33792 KB Execution killed with signal 9 (could be triggered by violating memory limits)
16 Runtime error 111 ms 33792 KB Execution killed with signal 9 (could be triggered by violating memory limits)
17 Correct 239 ms 1604 KB Output is correct
18 Correct 240 ms 1616 KB Output is correct
19 Correct 209 ms 3960 KB Output is correct
20 Correct 208 ms 3988 KB Output is correct