Submission #463019

# Submission time Handle Problem Language Result Execution time Memory
463019 2021-08-11T02:29:39 Z LptN21 Uzastopni (COCI15_uzastopni) C++14
160 / 160
154 ms 23852 KB
#include <bits/stdc++.h>
using namespace std;
#define fastIO ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
#define FF first
#define SS second
#define pb push_back
#define sz(x) (int)x.size()
#define PI acos(-1.0)
#define lb lower_bound
#define ub upper_bound
#define all(a) (a).begin(), (a).end()
#define odd(x) __builtin_parity((int)x)
#define cntbit(x) __builtin_popcount(x)
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<ii, int> i3;
const int N = 1e4+7, M=1e2+1;
const int MOD = 1e9+7;
const int oo = 1e15+7;

int n, m, k, t;

int a[N];
vector<ii> seg[N];
vector<int> adj[N], q[M];
bitset<M> mark[N][M];

void dfs(int u, int p=-1) {
    for(int v:adj[u]) if(v!=p) dfs(v, u);
    for(int i=1;i<M;i++) q[i].clear();
    for(int v:adj[u]) for(ii s:seg[v]) q[s.FF].pb(s.SS);
    for(int k=M-1;k>0;k--) {
        if(k==a[u]) {
            mark[u][k]|=mark[u][k+1];
            mark[u][k].set(k);
        } else {
            for(int t:q[k]) if(t<a[u]||k>a[u]) {
                mark[u][k]|=mark[u][t+1];
                mark[u][k].set(t);
            }
        }
        for(int t=M-1;t>=k;t--)
            if(mark[u][k].test(t)&&a[u]>=k&&a[u]<=t)
                seg[u].pb(ii(k, t));
    }
}

signed main() {
    //freopen("test.inp", "r", stdin);
    //freopen("test.out", "w", stdout);
    //fastIO;
    scanf("%d", &n);
    for(int i=1;i<=n;i++) scanf("%d", &a[i]);
    for(int i=1;i<n;i++) {
        scanf("%d%d", &k, &t);
        adj[k].pb(t), adj[t].pb(k);
    }
    dfs(1);
    printf("%d", sz(seg[1]));
    return 0;
}
/* stuff you should look for
    - int overflow, array bounds
    - special cases (n=1?)
    - do smth instead of do nothing and stay organized
    - WRITE STUFF DOWN
    - DONT JUST STICK ON ONE APPROACH
*/

Compilation message

uzastopni.cpp:19:20: warning: overflow in conversion from 'double' to 'int' changes value from '1.000000000000007e+15' to '2147483647' [-Woverflow]
   19 | const int oo = 1e15+7;
      |                ~~~~^~
uzastopni.cpp: In function 'int main()':
uzastopni.cpp:52:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   52 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
uzastopni.cpp:53:32: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |     for(int i=1;i<=n;i++) scanf("%d", &a[i]);
      |                           ~~~~~^~~~~~~~~~~~~
uzastopni.cpp:55:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |         scanf("%d%d", &k, &t);
      |         ~~~~~^~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 844 KB Output is correct
2 Correct 1 ms 844 KB Output is correct
3 Correct 2 ms 896 KB Output is correct
4 Correct 2 ms 844 KB Output is correct
5 Correct 2 ms 900 KB Output is correct
6 Correct 3 ms 972 KB Output is correct
7 Correct 3 ms 972 KB Output is correct
8 Correct 3 ms 972 KB Output is correct
9 Correct 3 ms 844 KB Output is correct
10 Correct 3 ms 844 KB Output is correct
11 Correct 114 ms 17328 KB Output is correct
12 Correct 120 ms 17296 KB Output is correct
13 Correct 130 ms 17324 KB Output is correct
14 Correct 123 ms 23852 KB Output is correct
15 Correct 129 ms 23820 KB Output is correct
16 Correct 154 ms 23744 KB Output is correct
17 Correct 113 ms 17324 KB Output is correct
18 Correct 146 ms 17256 KB Output is correct
19 Correct 151 ms 19804 KB Output is correct
20 Correct 141 ms 19828 KB Output is correct