Submission #841331

# Submission time Handle Problem Language Result Execution time Memory
841331 2023-09-01T14:03:08 Z danikoynov Closing Time (IOI23_closing) C++17
0 / 100
50 ms 10020 KB
#include "closing.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxn = 5e2 + 10;

vector < pair < int, ll > > adj[maxn];
ll dist[2][maxn];
int n;

void bfs(int s, ll arr[])
{
    queue < int > q;
    for (int i = 0; i < n; i ++)
        arr[i] = -1;

    arr[s] = 0;
    q.push(s);
    while(!q.empty())
    {
        int v = q.front();
        q.pop();
        for (pair < int, ll > nb : adj[v])
        {
            if (arr[nb.first] == -1)
            {
                arr[nb.first] = arr[v] + nb.second;
                q.push(nb.first);
            }
        }
    }
}
const ll inf = 1e18;

ll value[maxn];
ll dp[maxn][maxn * 2][2][2], sub[maxn], temp[maxn * 2][2][2];
int used[maxn];
/**

*/
vector < int > st[maxn];
void dfs(int v, int t)
{
    ///cout << "dfs " << v << endl;
    sub[v] = 1;
    used[v] = 1;
    if (t != v)
        st[t].push_back(v);

    for (int j = 0; j <= 2; j ++)
        for (int d = 0; d < 2; d ++)
            for (int z = 0; z < 2; z ++)
                dp[v][j][d][z] = inf;
    dp[v][0][0][0] = 0;
    dp[v][1][1][0] = dist[0][v];
    dp[v][1][0][1] = dist[1][v];
    dp[v][2][1][1] = max(dist[0][v], dist[1][v]);

    for (pair < int, ll > nb : adj[v])
    {
        if (used[nb.first])
            continue;

        dfs(nb.first, t);
        int u = nb.first;
        for (int i = 0; i <= (sub[u] + sub[v]) * 2; i ++)
            for (int x = 0; x < 2; x ++)
                for (int y = 0; y < 2; y ++)
                    temp[i][x][y]= inf;

        for (int i = 0; i <= sub[v] * 2; i ++)
            for (int j = 0; j <= sub[u] * 2; j ++)
                for (int d = 0; d < 2; d ++)
                    for (int z = 0; z < 2; z ++)
                        for (int x = 0; x <= d; x ++)
                            for (int y = 0; y <= z; y ++)
                            {

                                temp[i + j][d][z] = min(temp[i + j][d][z], dp[v][i][d][z] + dp[u][j][x][y]);
                            }

        for (int i = 0; i <= (sub[v] + sub[u]) * 2; i ++)
            for (int x = 0; x < 2; x ++)
                for (int y = 0; y < 2; y ++)
                    dp[v][i][x][y] = temp[i][x][y];
        sub[v] += sub[u];
    }
}


vector < int > path;
bool get_path(int v, int p, int target)
{
    if (v == target)
    {
        path.push_back(v);
        return true;
    }

    for (pair < int, ll > nb : adj[v])
    {
        if (nb.first == p)
            continue;
        if (get_path(nb.first, v, target))
        {
            path.push_back(v);
            return true;
        }
    }
    return false;
}

ll sum_dp[maxn * 2], tp[maxn * 2];
ll cur_sz = 0;

void unite(int v, int d, int z)
{
    /**cout << "unite " << endl;
    for (int i = 0; i <= sub[v] * 2; i ++)
        cout << dp[v][i][d][z]<< " ";
    cout << endl;*/
    for (int i = 0; i <= (cur_sz + sub[v]) * 2; i ++)
    {
        tp[i] = inf;
    }

    for (int j = 0; j <= 2 * cur_sz; j ++)
        for (int i = 0; i <= 2 * sub[v]; i ++)
        {
            tp[i + j] = min(tp[i + j], sum_dp[j] + dp[v][i][d][z]);
        }

    for (int i = 0; i <= (cur_sz + sub[v]) * 2; i ++)
        sum_dp[i] = tp[i];
    cur_sz += sub[v];
}

int bigK, ans;
int get_value(int i, int j)
{
    cur_sz = 0;
    for (int i = 0; i <= n * 2; i ++)
        sum_dp[i] = inf;
    sum_dp[0] = 0;
    for (int id = 0; id < path.size(); id ++)
    {
        unite(path[id], (id <= i), (id >= j));
    }
    int tek = 0;
    for (int i = 0; i <= n * 2; i ++)
    {
        if (sum_dp[i] <= bigK)
            tek = max(tek, i);
    }
    return tek;
}
int max_score(int N, int X, int Y, long long K,
              vector<int> U, vector<int> V, vector<int> W)
{
    bigK = K;
    for (int i = 0; i < N; i ++)
    {
        dist[0][i] = dist[1][i] = 0;
        adj[i].clear();
        used[i] = 0;
        value[i] = 0;
    }
    n = N;
    for (int i = 0; i < N - 1; i ++)
    {
        adj[U[i]].push_back({V[i], W[i]});
        adj[V[i]].push_back({U[i], W[i]});
    }

    bfs(X, dist[0]);
    bfs(Y, dist[1]);

    path.clear();
    get_path(Y, -1, X);

    for (int cur : path)
        used[cur] = 1;

    for (int cur : path)
    {
        dfs(cur, cur);
    }
    /**for (int cur : path)
    {
        cout << "step " << cur << endl;
        for (int j = 0; j <= sub[cur] * 2; j ++)
            cout << dp[cur][j][1][0] << " ";
        cout << endl;
    }

    cout << "sub " << sub[2] << endl;
    cout << "-----------------" << endl;*/

    int sz = path.size();
    ans = 0;

    for (int i = 0; i < sz; i ++)
    {
        cur_sz = 0;
        for (int i = 0; i <= N * 2 + 1; i ++)
            sum_dp[i] = inf;
        sum_dp[0] = 0;
        for (int j = i; j < sz; j ++)
        {
            //int i = 1;
            // int j = 1;
            unite(path[j], 1, 1);
            ///cout << "here " << i << " " << j << endl;
            ll sf = 0;
            for (int id = 0; id < i; id ++)
                sf += dist[0][path[id]];
            for (int id = j + 1; id < sz; id ++)
                sf += dist[1][path[id]];

            int len = j - i + 1;

            int cnt = sz + len;
            vector < ll > vec;
            for (int id = 0; id < i; id ++)
                for (int v : st[id])
                    vec.push_back(dist[0][v]);
            for (int id = j + 1; id < sz; id ++)
                for (int v : st[id])
                    vec.push_back(dist[1][v]);
            sort(vec.begin(), vec.end());
            for (int d = 1; d < vec.size(); d ++)
                vec[d] = vec[d - 1] + vec[d];

            for (int tk = 0; tk <= 2 * cur_sz; tk ++)
            {
                ll left_k = K - sf - sum_dp[tk];

                ///cout << " :: " << tk << " " << sum_dp[tk] << " " << left_k << endl;
                if (left_k < 0)
                    continue;

                int lf = 0, rf = (int)(vec.size()) - 1;
                while(lf <= rf)
                {
                    int mf = (lf + rf) / 2;
                    if (vec[mf] <= left_k)
                        lf = mf + 1;
                    else
                        rf = mf - 1;
                }
                int all = sz - len + tk + rf + 1;
                if (all > ans)
                    ans = all;
            }

            if (sf <= K)
                ans = max(ans, sz - len);
            for (int i = 0; i < vec.size(); i ++)
            {
                if (vec[i] + sf <= K)
                    ans = max(ans, sz - len + i + 1);
            }
        }
        /**for (int j = 0; j < sz; j ++)
        {

            cur_sz = 0;

            sum_dp[0] = 0;
            for (int id = 0; id < sz; id ++)
            {
                unite(path[id], (id <= i), (id >= j));
            }
            for (int i = 0; i <= N * 2; i ++)
            {
                if (sum_dp[i] <= K)
                    ans = max(ans, i);
            }


            ///cout << j << " : " << ans << endl;



        }*/

        ///cout << i << " " << opt << endl;
    }

    return ans;

}

Compilation message

closing.cpp: In function 'int get_value(int, int)':
closing.cpp:147:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |     for (int id = 0; id < path.size(); id ++)
      |                      ~~~^~~~~~~~~~~~~
closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:233:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  233 |             for (int d = 1; d < vec.size(); d ++)
      |                             ~~^~~~~~~~~~~~
closing.cpp:260:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  260 |             for (int i = 0; i < vec.size(); i ++)
      |                             ~~^~~~~~~~~~~~
closing.cpp:224:17: warning: unused variable 'cnt' [-Wunused-variable]
  224 |             int cnt = sz + len;
      |                 ^~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 50 ms 10020 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 0 ms 468 KB Output is correct
8 Incorrect 0 ms 468 KB 1st lines differ - on the 1st token, expected: '74', found: '72'
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 0 ms 468 KB Output is correct
8 Incorrect 0 ms 468 KB 1st lines differ - on the 1st token, expected: '74', found: '72'
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 0 ms 468 KB Output is correct
8 Incorrect 0 ms 468 KB 1st lines differ - on the 1st token, expected: '74', found: '72'
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 0 ms 340 KB Output is correct
7 Correct 0 ms 340 KB Output is correct
8 Correct 0 ms 340 KB Output is correct
9 Correct 0 ms 340 KB Output is correct
10 Incorrect 0 ms 340 KB 1st lines differ - on the 1st token, expected: '14', found: '12'
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 0 ms 340 KB Output is correct
7 Correct 1 ms 596 KB Output is correct
8 Correct 0 ms 468 KB Output is correct
9 Incorrect 0 ms 468 KB 1st lines differ - on the 1st token, expected: '74', found: '72'
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 0 ms 340 KB Output is correct
7 Correct 1 ms 596 KB Output is correct
8 Correct 0 ms 468 KB Output is correct
9 Incorrect 0 ms 468 KB 1st lines differ - on the 1st token, expected: '74', found: '72'
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 0 ms 340 KB Output is correct
7 Correct 1 ms 596 KB Output is correct
8 Correct 0 ms 468 KB Output is correct
9 Incorrect 0 ms 468 KB 1st lines differ - on the 1st token, expected: '74', found: '72'
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 0 ms 340 KB Output is correct
7 Correct 1 ms 596 KB Output is correct
8 Correct 0 ms 468 KB Output is correct
9 Incorrect 0 ms 468 KB 1st lines differ - on the 1st token, expected: '74', found: '72'
10 Halted 0 ms 0 KB -